Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions packages/api/src/core/metadata-instances.ts
Original file line number Diff line number Diff line change
Expand Up @@ -355,3 +355,81 @@ export function getCompareResultStatistics(params: any) {
{ params },
)
}

export interface Field {
autoincrement: string
columnPosition: number
dataType: string
deleted: boolean
fieldName: string
id: string
isAutoAllowed: boolean
isNullable: boolean
originalDataType: string
originalFieldName: string
previousDataType: string
previousFieldName: string
primaryKey: boolean
primaryKeyPosition?: number
simpleTypeName: string
source: string
sourceDbType: string
tapType: string
unique: boolean
useDefaultValue: boolean
[property: string]: any
}

export interface Column {
columnIsAsc: boolean
columnName: string
columnPosition: number
[property: string]: any
}

export interface FieldIndex {
columns: Column[]
coreUnique: boolean
indexName: string
primaryKey: string
unique: boolean
[property: string]: any
}
export interface SchemaData {
ancestorsName: string
comment: string
constraints: string[]
createAt: number
createSource: string
createUser: string
databaseId: string
deleted: boolean
fields: Field[]
hasPrimaryKey: boolean
hasTransformEx: boolean
hasUnionIndex: boolean
hasUpdateField: boolean
id: string
indices: FieldIndex[]
lastUpdAt: number
lastUpdate: number
lastUpdBy: string
lastUserName: string
metaType: string
name: string
originalName: string
partitionSet: string[]
qualifiedName: string
source: any
sourceType: string
tableAttr: any
userId: string
username: string
[property: string]: any
}

export function reloadSchema(connectionId: string, tableName: string) {
return requestClient.post<SchemaData>(
`/api/schema/reload?connectionId=${connectionId}&tableName=${tableName}`,
)
}
3 changes: 3 additions & 0 deletions packages/business/src/locale/lang/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -1021,6 +1021,9 @@ export default {
packages_business_data_server_drawer_zanwumiaoshu: 'no description yet',
packages_business_data_server_drawer_tiaoshi: 'Debug',
packages_business_data_server_drawer_peizhi: 'Configuration',
packages_business_data_server_drawer_refresh_fields: 'Refresh Fields',
packages_business_data_server_add_field: 'Add Field',
packages_business_data_server_add_sub_field: 'Add Sub-field',
packages_business_data_server_drawer_chuangjianfuwu: 'Create API',
packages_business_copy_server: 'Copy API',
packages_business_import_server: 'Import API',
Expand Down
3 changes: 3 additions & 0 deletions packages/business/src/locale/lang/zh-CN.js
Original file line number Diff line number Diff line change
Expand Up @@ -934,6 +934,9 @@ export default {
packages_business_data_server_drawer_zanwumiaoshu: '暂无描述',
packages_business_data_server_drawer_tiaoshi: '调试',
packages_business_data_server_drawer_peizhi: '配置',
packages_business_data_server_drawer_refresh_fields: '刷新字段',
packages_business_data_server_add_field: '添加字段',
packages_business_data_server_add_sub_field: '添加子字段',
packages_business_data_server_drawer_chuangjianfuwu: '创建服务',
packages_business_data_server_drawer_fuwuxiangqing: '服务详情',
packages_business_data_server_list_quedingchexiaogai: '确定撤销该服务?',
Expand Down
3 changes: 3 additions & 0 deletions packages/business/src/locale/lang/zh-TW.js
Original file line number Diff line number Diff line change
Expand Up @@ -926,6 +926,9 @@ export default {
packages_business_data_server_drawer_zanwumiaoshu: '暫無描述',
packages_business_data_server_drawer_tiaoshi: '調試',
packages_business_data_server_drawer_peizhi: '配置',
packages_business_data_server_drawer_refresh_fields: '刷新字段',
packages_business_data_server_add_field: '添加字段',
packages_business_data_server_add_sub_field: '添加子字段',
packages_business_data_server_drawer_chuangjianfuwu: '創建服務',
packages_business_copy_server: '復製服務',
packages_business_import_server: '導入服務',
Expand Down
183 changes: 158 additions & 25 deletions packages/business/src/views/data-server/Drawer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ import { EditPen, InfoFilled } from '@element-plus/icons-vue'
import { fetchConnections } from '@tap/api/src/core/connections'
import { fetchDatabaseTypes } from '@tap/api/src/core/database-types'
import { fetchEncryptionList } from '@tap/api/src/core/encryption'
import { fetchMetadataInstances } from '@tap/api/src/core/metadata-instances'
import {
fetchMetadataInstances,
reloadSchema,
} from '@tap/api/src/core/metadata-instances'
import {
createApiModule,
updateApiModule,
Expand Down Expand Up @@ -299,7 +302,6 @@ const handleChangeConnection = (connection: any) => {
}

const getFields = async () => {
selectedFieldSize.value = 0
fieldLoading.value = true
const filter = {
where: {
Expand All @@ -313,7 +315,27 @@ const getFields = async () => {
try {
const data = await fetchMetadataInstances(filter)

allFields.value = data.items?.[0]?.fields || []
const metaFields = data.items?.[0]?.fields || []
const userCreatedFields = allFields.value.filter(
(f: any) => f.tag === 'USER_CREATE',
)
const metaFieldNames = new Set(metaFields.map((f: any) => f.field_name))
const userFieldsMap = userCreatedFields.reduce((acc: any, f: any) => {
acc[f.field_name] = f
return acc
}, {})
const mergedMetaFields = metaFields.map((f: any) => {
const userField = userFieldsMap[f.field_name]
if (userField?.textEncryptionRuleIds?.length) {
return { ...f, textEncryptionRuleIds: userField.textEncryptionRuleIds }
}
return f
})
// 只保留 metaFields 中不存在的用户字段
const remainingUserFields = userCreatedFields.filter(
(f: any) => !metaFieldNames.has(f.field_name),
)
allFields.value = [...mergedMetaFields, ...remainingUserFields]

if (!form.value.id || !form.value.fields?.length) {
nextTick(() => {
Expand Down Expand Up @@ -350,13 +372,16 @@ const open = (formData?: any, copy?: boolean) => {
} else {
formatData(cloneDeep(formData))

const { connectionId, tableName } = formData

if (copy) {
allFields.value = formData?.fields || []
} else if (connectionId && tableName) {
getFields()
}
// const { connectionId, tableName } = formData
allFields.value = formData?.fields || []
selectedFieldSize.value = 0
getFields()
// if (copy) {
// // allFields.value = formData?.fields || []
// } else if (connectionId && tableName) {
// selectedFieldSize.value = 0
// getFields()
// }

if (!formData.id) {
edit(copy)
Expand Down Expand Up @@ -501,20 +526,21 @@ const save = async (type?: boolean) => {
}

if (!type && connectionId && tableName) {
const fieldList = await getAllFields()

const map = fields.reduce((acc: any, field: any) => {
field.field_alias = field.field_alias?.trim() || ''
acc[field.id] = field
return acc
}, {})

formData.fields = fieldList.map((f: any) => {
return {
...f,
field_alias: map[f.id]?.field_alias,
}
})
formData.fields = allFields.value
// const fieldList = await getAllFields()

// const map = fields.reduce((acc: any, field: any) => {
// field.field_alias = field.field_alias?.trim() || ''
// acc[field.id] = field
// return acc
// }, {})

// formData.fields = fieldList.map((f: any) => {
// return {
// ...f,
// field_alias: map[f.id]?.field_alias,
// }
// })
}

const func = id ? updateApiModule : createApiModule
Expand Down Expand Up @@ -575,6 +601,7 @@ const edit = (copy?: boolean) => {
const handleCancel = () => {
isEdit.value = false
form.value = initialFormData
selectedFieldSize.value = 0
getFields()
}

Expand All @@ -599,6 +626,7 @@ const handleChangeApiType = () => {
const handleChangeTable = () => {
form.value.fields = []
allFields.value = []
selectedFieldSize.value = 0
getFields()
form_ref.value?.clearValidate('tableName')
}
Expand Down Expand Up @@ -664,6 +692,32 @@ const handleAddParameter = (index: number | string) => {
})
}

const handleReloadSchema = async () => {
const { connectionId, tableName } = form.value
if (!connectionId || !tableName) return

// 保存当前选中的字段
const checkedFields = fieldsTreeRef.value?.getCheckedFields(true) || []

fieldLoading.value = true
try {
await reloadSchema(connectionId, tableName)
await getFields()

// 恢复之前的选中状态
if (checkedFields.length) {
nextTick(() => {
fieldsTreeRef.value?.setCheckedFields(checkedFields)
selectedFieldSize.value = (
fieldsTreeRef.value?.getCheckedFields(false) || []
).length
})
}
} finally {
fieldLoading.value = false
}
}

// Expose key methods
defineExpose({
open,
Expand Down Expand Up @@ -864,6 +918,68 @@ function onFieldsTreeCheck(keys: string[]) {
selectedFieldSize.value = keys.length
}

function onAddField(field: any) {
allFields.value = [...allFields.value, field]
}

function onDeleteField(field: any) {
const fieldName = field.field_name
const prefix = `${fieldName}.`
// 删除字段本身及其所有子字段
allFields.value = allFields.value.filter(
(f: any) => f.field_name !== fieldName && !f.field_name.startsWith(prefix),
)
// 重新触发 check 更新
nextTick(() => {
const keys = (fieldsTreeRef.value?.getCheckedFields(false) || [])
.map((f: any) => f.field_name)
.filter((k: string) => k !== fieldName && !k.startsWith(prefix))
selectedFieldSize.value = keys.length
})
}

function onUpdateFieldName(oldFieldName: string, newName: string) {
const parts = oldFieldName.split('.')
parts[parts.length - 1] = newName
const newFieldName = parts.join('.')

allFields.value = allFields.value.map((f: any) => {
if (f.field_name === oldFieldName) {
return { ...f, field_name: newFieldName }
}
// 同步更新子字段路径
if (f.field_name.startsWith(`${oldFieldName}.`)) {
return {
...f,
field_name: newFieldName + f.field_name.slice(oldFieldName.length),
}
}
return f
})
}

const CONTAINER_TYPES = ['OBJECT', 'DOCUMENT', 'ARRAY', 'MAP']

function onUpdateFieldType(fieldName: string, newType: string) {
const isContainer = CONTAINER_TYPES.includes(newType.toUpperCase())
const prefix = `${fieldName}.`

allFields.value = allFields.value
.filter((f: any) => {
// 改为非容器类型时,删除所有子字段
if (!isContainer && f.field_name.startsWith(prefix)) {
return false
}
return true
})
.map((f: any) => {
if (f.field_name === fieldName) {
return { ...f, data_type: newType, simpleTypeName: newType }
}
return f
})
}

function editable(
item: any,
fromVal: any,
Expand Down Expand Up @@ -2159,7 +2275,10 @@ provide('form', form)

<!-- 输出结果 -->
<template v-if="tab === 'form'">
<div class="data-server-panel__title mt-7 mb-3 gap-2">
<div
class="data-server-panel__title mt-7 mb-3 gap-2"
style="--btn-space: 0"
>
<span>{{
$t('packages_business_data_server_drawer_shuchujieguo')
}}</span>
Expand All @@ -2168,6 +2287,16 @@ provide('form', form)
</el-tag>
<div class="flex-1" />
<template v-if="isEdit && selectedFieldSize">
<el-button
text
:loading="fieldLoading"
@click="handleReloadSchema"
>
<template #icon>
<i-lucide-refresh-cw />
</template>
{{ $t('packages_business_data_server_drawer_refresh_fields') }}
</el-button>
<el-dropdown placement="bottom" @command="handleAliasConversion">
<el-button text>
<el-icon class="mr-1"><i-lucide-wand-sparkles /></el-icon>
Expand Down Expand Up @@ -2210,6 +2339,10 @@ provide('form', form)
ref="fieldsTreeRef"
:fields="allFields"
@check="onFieldsTreeCheck"
@add-field="onAddField"
@delete-field="onDeleteField"
@update-field-name="onUpdateFieldName"
@update-field-type="onUpdateFieldType"
/>
<FieldsTreePreview v-else :fields="form.fields" />
</template>
Expand Down
Loading
Loading