@@ -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