Skip to content

Commit 28e28ef

Browse files
committed
fix:重复创建模型,当字段为枚举值时报错
1 parent 1ec0bbe commit 28e28ef

File tree

1 file changed

+90
-47
lines changed

1 file changed

+90
-47
lines changed

packages/plugins/model-manager/src/components/ModelSetting.vue

Lines changed: 90 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -134,71 +134,114 @@ export default {
134134
field.options.splice(index, 1)
135135
}
136136
137+
const isSaving = ref(false)
138+
137139
// 保存模型时一并保存version字段
138140
const saveModel = async () => {
139141
// 从子组件获取最新的数据
140142
const latestModelData = modelBasicFormRef.value?.getLocalValue()
141-
modelBasicFormRef.value.validate().then(async (valid) => {
142-
if (valid) {
143-
const newModel = {
144-
description: latestModelData.description,
145-
modelUrl: latestModelData.modelUrl,
146-
nameCn: latestModelData.nameCn,
147-
nameEn: latestModelData.nameEn,
148-
version: latestModelData.version,
149-
id: latestModelData.id,
150-
parameters: latestModelData.parameters.filter((item) => !!item.prop)
151-
}
152-
let isModelRefRelative = true
153-
let propertyName = ''
154-
if (newModel.parameters?.length > 0) {
155-
newModel.parameters.forEach((item) => {
156-
if (item.type === 'Enum') {
157-
item.options = JSON.stringify(item.options)
158-
}
159-
if (item.type === 'ModelRef') {
160-
item.isModel = true
161-
delete item.options
162-
item.defaultValue = item.defaultValue || null
163-
isModelRefRelative = !!item.defaultValue
164-
propertyName = item.prop
165-
}
166-
})
167-
}
168-
if (!isModelRefRelative) {
143+
modelBasicFormRef.value
144+
.validate()
145+
.then(async (valid) => {
146+
if (valid) {
147+
isSaving.value = true // 设置保存标志
148+
149+
// 深拷贝一份数据用于保存
150+
const newModel = {
151+
description: latestModelData.description,
152+
modelUrl: latestModelData.modelUrl,
153+
nameCn: latestModelData.nameCn,
154+
nameEn: latestModelData.nameEn,
155+
version: latestModelData.version,
156+
id: latestModelData.id,
157+
parameters: JSON.parse(JSON.stringify(latestModelData.parameters.filter((item) => !!item.prop)))
158+
}
159+
160+
let isModelRefRelative = true
161+
let propertyName = ''
162+
163+
if (newModel.parameters?.length > 0) {
164+
newModel.parameters.forEach((item) => {
165+
if (item.type === 'Enum') {
166+
// 保存时序列化为字符串
167+
item.options = JSON.stringify(item.options || [])
168+
}
169+
if (item.type === 'ModelRef') {
170+
item.isModel = true
171+
delete item.options
172+
item.defaultValue = item.defaultValue || null
173+
isModelRefRelative = !!item.defaultValue
174+
propertyName = item.prop
175+
}
176+
})
177+
}
178+
179+
if (!isModelRefRelative) {
180+
Notify({
181+
type: 'error',
182+
message: `字段${propertyName}未关联模型引用`
183+
})
184+
isSaving.value = false
185+
return
186+
}
187+
188+
if (latestModelData.id === null) {
189+
delete newModel.id
190+
await createModel(newModel)
191+
} else {
192+
await updateModel(newModel.id, newModel)
193+
}
194+
195+
emit('editCallback')
169196
Notify({
170-
type: 'error',
171-
message: `字段${propertyName}未关联模型引用`
197+
type: 'success',
198+
message: '保存成功'
172199
})
173-
return
174-
}
175-
if (latestModelData.id === null) {
176-
delete newModel.id
177-
await createModel(newModel)
178-
} else {
179-
await updateModel(newModel.id, newModel)
200+
201+
// 关闭面板
202+
closeModelSettingPanel()
203+
selectedModel.value = null
204+
isSaving.value = false
180205
}
181-
emit('editCallback')
182-
Notify({
183-
type: 'success',
184-
message: '保存成功'
185-
})
186-
selectedModel.value = null
187-
}
188-
})
206+
})
207+
.catch(() => {
208+
isSaving.value = false
209+
})
189210
}
190211
191212
const deleteModel = () => {
192213
emit('deleteCallback', selectedModel.value)
193214
closeModelSettingPanel()
194215
}
216+
195217
// 监听 props 变化,同步到本地(当选择不同模型时)
196218
watch(
197219
() => props.model,
198220
(newModel) => {
199-
selectedModel.value = newModel
221+
if (!isSaving.value && newModel) {
222+
// 只在非保存过程中处理
223+
// 深拷贝避免修改props
224+
const modelCopy = JSON.parse(JSON.stringify(newModel))
225+
226+
// 加载时反序列化枚举字段
227+
if (modelCopy.parameters) {
228+
modelCopy.parameters.forEach((param) => {
229+
if (param.type === 'Enum' && typeof param.options === 'string') {
230+
try {
231+
param.options = JSON.parse(param.options)
232+
} catch (e) {
233+
param.options = [{ value: '', label: '' }]
234+
}
235+
}
236+
})
237+
}
238+
239+
selectedModel.value = modelCopy
240+
} else {
241+
selectedModel.value = newModel
242+
}
200243
},
201-
{ deep: true }
244+
{ deep: true, immediate: true }
202245
)
203246
return {
204247
isShow,

0 commit comments

Comments
 (0)