Skip to content
Merged
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
139 changes: 91 additions & 48 deletions packages/plugins/model-manager/src/components/ModelSetting.vue
Original file line number Diff line number Diff line change
Expand Up @@ -134,71 +134,114 @@ export default {
field.options.splice(index, 1)
}

const isSaving = ref(false)

// 保存模型时一并保存version字段
const saveModel = async () => {
// 从子组件获取最新的数据
const latestModelData = modelBasicFormRef.value?.getLocalValue()
modelBasicFormRef.value.validate().then(async (valid) => {
if (valid) {
const newModel = {
description: latestModelData.description,
modelUrl: latestModelData.modelUrl,
nameCn: latestModelData.nameCn,
nameEn: latestModelData.nameEn,
version: latestModelData.version,
id: latestModelData.id,
parameters: latestModelData.parameters.filter((item) => !!item.prop)
}
let isModelRefRelative = true
let propertyName = ''
if (newModel.parameters?.length > 0) {
newModel.parameters.forEach((item) => {
if (item.type === 'Enum') {
item.options = JSON.stringify(item.options)
}
if (item.type === 'ModelRef') {
item.isModel = true
delete item.options
item.defaultValue = item.defaultValue || null
isModelRefRelative = !!item.defaultValue
propertyName = item.prop
}
})
}
if (!isModelRefRelative) {
modelBasicFormRef.value
.validate()
.then(async (valid) => {
Comment thread
lichunn marked this conversation as resolved.
if (valid) {
isSaving.value = true // 设置保存标志

// 深拷贝一份数据用于保存
const newModel = {
description: latestModelData.description,
modelUrl: latestModelData.modelUrl,
nameCn: latestModelData.nameCn,
nameEn: latestModelData.nameEn,
version: latestModelData.version,
id: latestModelData.id,
parameters: JSON.parse(JSON.stringify(latestModelData.parameters.filter((item) => !!item.prop)))
}

let isModelRefRelative = true
let propertyName = ''

if (newModel.parameters?.length > 0) {
newModel.parameters.forEach((item) => {
if (item.type === 'Enum') {
// 保存时序列化为字符串
item.options = JSON.stringify(item.options || [])
}
if (item.type === 'ModelRef') {
item.isModel = true
delete item.options
item.defaultValue = item.defaultValue || null
isModelRefRelative = !!item.defaultValue
propertyName = item.prop
}
})
Comment thread
lichunn marked this conversation as resolved.
}

if (!isModelRefRelative) {
Notify({
type: 'error',
message: `字段${propertyName}未关联模型引用`
})
isSaving.value = false
return
}

if (latestModelData.id === null) {
delete newModel.id
await createModel(newModel)
} else {
await updateModel(newModel.id, newModel)
}

emit('editCallback')
Notify({
type: 'error',
message: `字段${propertyName}未关联模型引用`
type: 'success',
message: '保存成功'
})
return
}
if (latestModelData.id === null) {
delete newModel.id
await createModel(newModel)
} else {
await updateModel(newModel.id, newModel)

// 关闭面板
closeModelSettingPanel()
selectedModel.value = null
isSaving.value = false
Comment thread
lichunn marked this conversation as resolved.
}
emit('editCallback')
Notify({
type: 'success',
message: '保存成功'
})
selectedModel.value = null
}
})
})
.catch(() => {
isSaving.value = false
})
}

const deleteModel = () => {
$emit('deleteCallback', selectedModel)
emit('deleteCallback', selectedModel.value)
closeModelSettingPanel()
}

// 监听 props 变化,同步到本地(当选择不同模型时)
watch(
() => props.model,
(newModel) => {
selectedModel.value = newModel
if (!isSaving.value && newModel) {
// 只在非保存过程中处理
// 深拷贝避免修改props
const modelCopy = JSON.parse(JSON.stringify(newModel))

// 加载时反序列化枚举字段
if (modelCopy.parameters) {
modelCopy.parameters.forEach((param) => {
if (param.type === 'Enum' && typeof param.options === 'string') {
try {
param.options = JSON.parse(param.options)
} catch (e) {
param.options = [{ value: '', label: '' }]
}
}
})
}

selectedModel.value = modelCopy
} else {
selectedModel.value = newModel
}
Comment thread
lichunn marked this conversation as resolved.
},
{ deep: true }
{ deep: true, immediate: true }
)
return {
isShow,
Expand Down