11<script setup lang="ts">
22import { computed , inject , onMounted , useTemplateRef } from ' vue'
3- import { QuestionFilled } from ' @element-plus/icons-vue'
43import { cloneDeep } from ' lodash'
54import type { FormInstance } from ' element-plus'
65import ApplicationApi from ' @/api/admin/workspace/application/application'
76import { APPLICATION_TYPE } from ' @/api/enums'
87import NodeCascader from ' @/workflow-canvas/core/NodeCascader.vue'
98import NodeContainer from ' @/workflow-canvas/core/node-container/index.vue'
109import type { WorkflowNodeModel } from ' @/workflow-canvas/core/workflow-node'
11- import { WorkflowNodeType } from ' @/workflow-canvas/types'
10+ import { WorkflowMode , WorkflowNodeType } from ' @/workflow-canvas/types'
1211
1312defineOptions ({ name: ' WorkflowApplicationNode' })
1413
@@ -55,35 +54,45 @@ interface ReferencedApplicationProperties {
5554
5655const uploadFields: UploadField [] = [' document' , ' image' , ' audio' , ' video' ]
5756const getModel = inject (' getModel' ) as () => WorkflowNodeModel
57+ const workflowMode = inject <WorkflowMode >(' workflowMode' , WorkflowMode .Application )
5858const model = getModel ()
5959
6060const formRef = useTemplateRef <FormInstance >(' formRef' )
61- const questionCascaderRef = useTemplateRef <InstanceType <typeof NodeCascader >>(' questionCascaderRef' )
6261
63- const applicationNodeData = (model .properties .node_data ?? {}) as Partial <ApplicationNodeForm >
64- if (! Array .isArray (applicationNodeData .question_reference_address )) {
65- applicationNodeData .question_reference_address = [WorkflowNodeType .Start , ' question' ]
62+ // 一次性补齐旧节点表单,保留已保存的参数和文件引用。
63+ const defaultForm: ApplicationNodeForm = {
64+ api_input_field_list: [],
65+ user_input_field_list: [],
66+ question_reference_address: [WorkflowNodeType .Start , ' question' ],
67+ is_result: false ,
68+ }
69+ const savedForm = model .properties .node_data as Partial <ApplicationNodeForm > | undefined
70+ model .properties .node_data = {
71+ ... defaultForm ,
72+ ... savedForm ,
73+ api_input_field_list: Array .isArray (savedForm ?.api_input_field_list ) ? savedForm .api_input_field_list : defaultForm .api_input_field_list ,
74+ user_input_field_list: Array .isArray (savedForm ?.user_input_field_list ) ? savedForm .user_input_field_list : defaultForm .user_input_field_list ,
75+ question_reference_address: Array .isArray (savedForm ?.question_reference_address )
76+ ? savedForm .question_reference_address
77+ : defaultForm .question_reference_address ,
78+ is_result: savedForm ?.is_result ?? defaultForm .is_result ,
6679}
67- if (! Array .isArray (applicationNodeData .api_input_field_list )) applicationNodeData .api_input_field_list = []
68- if (! Array .isArray (applicationNodeData .user_input_field_list )) applicationNodeData .user_input_field_list = []
69- if (applicationNodeData .is_result === undefined ) applicationNodeData .is_result = false
70- model .properties .node_data = applicationNodeData as ApplicationNodeForm
7180
7281const formData = computed <ApplicationNodeForm >({
7382 get : () => model .properties .node_data as ApplicationNodeForm ,
7483 set : (value ) => (model .properties .node_data = value ),
7584})
7685
86+ const showReturnContent = computed (() =>
87+ [WorkflowMode .Application , WorkflowMode .ApplicationLoop , WorkflowMode .Tool , WorkflowMode .ToolLoop ].includes (workflowMode ),
88+ )
89+
7790function formatFieldLabel(label : FieldLabel ) {
7891 return typeof label === ' object' && label !== null ? (label .label ?? ' ' ) : label
7992}
8093
81- function validate() {
82- return Promise .all ([questionCascaderRef .value ?.validate (), formRef .value ?.validate ()]).catch ((error ) =>
83- Promise .reject ({ node: model , errMessage: error }),
84- )
85- }
8694
95+ // 根据关联智能体配置同步输入字段,按字段标识保留已选变量。
8796function syncUploadField(field : UploadField , enabled : boolean ) {
8897 const listKey: UploadListKey = ` ${field }_list `
8998 if (enabled ) {
@@ -152,6 +161,13 @@ function refreshApplicationFields() {
152161 })
153162}
154163
164+ async function validate() {
165+ return formRef .value ?.validate ().catch ((error ) =>
166+ Promise .reject ({ node: model , errMessage: error }),
167+ )
168+ }
169+
170+
155171onMounted (() => {
156172 refreshApplicationFields ()
157173 model .validate = validate
@@ -160,17 +176,12 @@ onMounted(() => {
160176
161177<template >
162178 <NodeContainer :node-model =" model " >
163- <h6 class =" mb-3 " >节点设置</h6 >
179+ <h6 class =" mk-title-decoration mb-2 " >节点设置</h6 >
164180
165- <el-card shadow = " never " class =" card-never " >
181+ <div class =" mk-gray-card " >
166182 <el-form ref =" formRef" :model =" formData" label-position =" top" require-asterisk-position =" right" @submit.prevent >
167183 <el-form-item label =" 用户问题" prop =" question_reference_address" :rules =" { message: '请选择用户问题', trigger: 'change', required: true }" >
168- <NodeCascader
169- ref="questionCascaderRef"
170- v-model =" formData .question_reference_address "
171- :node-model =" model "
172- placeholder="请选择用户问题"
173- />
184+ <NodeCascader ref="questionCascaderRef" v-model =" formData .question_reference_address " :node-model =" model " placeholder="请选择用户问题" />
174185 </el-form-item >
175186
176187 <el-form-item v-if =" formData.document_list !== undefined" label =" 选择文档" prop =" document_list" >
@@ -209,18 +220,17 @@ onMounted(() => {
209220 <NodeCascader v-model =" field .value " :node-model =" model " placeholder="请选择参数" />
210221 </el-form-item >
211222
212- <el-form-item label =" 返回内容" @click.prevent >
213- <template #label >
214- <div class =" flex items-center gap-1" >
215- <span >返回内容</span >
216- <el-tooltip content =" 开启后,该节点的输出会作为工作流的最终回复内容" effect =" dark" placement =" right" >
217- <MkIcon :icon =" QuestionFilled " class="cursor-help text-N600" />
218- </el-tooltip >
219- </div >
220- </template >
223+ <!-- 返回内容 -->
224+ <div v-if =" showReturnContent" class =" flex-between w-full" >
225+ <span class =" flex items-center gap-1" >
226+ 返回内容
227+ <el-tooltip content =" 关闭后该节点的内容则不输出给用户。如果你想让用户看到该节点的输出内容,请打开开关。" placement =" right" >
228+ <MkIcon name="icon_info_outlined" class="text-N600!" />
229+ </el-tooltip >
230+ </span >
221231 <el-switch v-model =" formData.is_result" size =" small" />
222- </el-form-item >
232+ </div >
223233 </el-form >
224- </el-card >
234+ </div >
225235 </NodeContainer >
226236</template >
0 commit comments