Commit b23d7f44 by weiyudumei

fix: 修复 workflow 卡片自动提交重复触发的问题,使用 useRef 和 useCallback 稳定函数引用

parent 6ae9376c
...@@ -409,7 +409,7 @@ export const Chat: React.FC = () => { ...@@ -409,7 +409,7 @@ export const Chat: React.FC = () => {
} }
/** 处理 workflow 表单提交 */ /** 处理 workflow 表单提交 */
const handleWorkflowSubmit = async (paramMap: Record<string, string>, recordId?: string, workFlowSessionId?: string) => { const handleWorkflowSubmit = useCallback(async (paramMap: Record<string, string>, recordId?: string, workFlowSessionId?: string) => {
// workflow 提交时,question 可以为空字符串,但需要传递 paramMap、recordId 和 workFlowSessionId // workflow 提交时,question 可以为空字符串,但需要传递 paramMap、recordId 和 workFlowSessionId
await handleSubmitQuestion('', undefined, undefined, { await handleSubmitQuestion('', undefined, undefined, {
paramMap, paramMap,
...@@ -417,7 +417,7 @@ export const Chat: React.FC = () => { ...@@ -417,7 +417,7 @@ export const Chat: React.FC = () => {
workFlowSessionId, workFlowSessionId,
recordType: 'A01', recordType: 'A01',
}) })
} }, [])
/** 获取qa记录 */ /** 获取qa记录 */
const getUserQaRecordPage = useCallback(async (conversationId: string, toolId?: string) => { const getUserQaRecordPage = useCallback(async (conversationId: string, toolId?: string) => {
......
...@@ -22,6 +22,12 @@ export const CardWorkflowForm: React.FC<CardWorkflowFormProps> = ({ ...@@ -22,6 +22,12 @@ export const CardWorkflowForm: React.FC<CardWorkflowFormProps> = ({
const [searchParams] = useSearchParams() const [searchParams] = useSearchParams()
const hasAutoSubmittedRef = useRef(false) // 防止重复自动提交 const hasAutoSubmittedRef = useRef(false) // 防止重复自动提交
const lastFirstQaFlagRef = useRef<boolean | undefined>(undefined) // 记录上次的 firstQaFlag 值 const lastFirstQaFlagRef = useRef<boolean | undefined>(undefined) // 记录上次的 firstQaFlag 值
const onSubmitWorkflowRef = useRef(onSubmitWorkflow) // 保存 onSubmitWorkflow 的引用,避免依赖项变化导致重复执行
// 更新 onSubmitWorkflowRef 的引用
useEffect(() => {
onSubmitWorkflowRef.current = onSubmitWorkflow
}, [onSubmitWorkflow])
// 获取 text 类型的字段,使用 useMemo 稳定引用 // 获取 text 类型的字段,使用 useMemo 稳定引用
const textFields = useMemo(() => { const textFields = useMemo(() => {
...@@ -85,12 +91,13 @@ export const CardWorkflowForm: React.FC<CardWorkflowFormProps> = ({ ...@@ -85,12 +91,13 @@ export const CardWorkflowForm: React.FC<CardWorkflowFormProps> = ({
// 延迟一下再提交,确保表单值已经设置完成 // 延迟一下再提交,确保表单值已经设置完成
setTimeout(() => { setTimeout(() => {
onSubmitWorkflow(paramMap, recordId, workFlowSessionId) onSubmitWorkflowRef.current(paramMap, recordId, workFlowSessionId)
}, 100) }, 100)
} }
} }
// 移除 answer.recordId 和 answer.workFlowSessionId 作为依赖项,避免流式更新时重复触发 // 移除 onSubmitWorkflow 作为依赖项,使用 useRef 保存引用,避免函数引用变化导致重复触发
}, [answer.firstQaFlag, isSubmitting, isCompleted, searchParams, textFields, onSubmitWorkflow]) // eslint-disable-next-line react-hooks/exhaustive-deps
}, [answer.firstQaFlag, isSubmitting, isCompleted, searchParams, textFields])
const handleInputChange = (key: string, value: string) => { const handleInputChange = (key: string, value: string) => {
setFormValues(prev => ({ setFormValues(prev => ({
......
...@@ -625,7 +625,7 @@ export const TacticsChat: React.FC = () => { ...@@ -625,7 +625,7 @@ export const TacticsChat: React.FC = () => {
} }
/** 处理 workflow 表单提交 */ /** 处理 workflow 表单提交 */
const handleWorkflowSubmit = async (paramMap: Record<string, string>, recordId?: string, workFlowSessionId?: string) => { const handleWorkflowSubmit = useCallback(async (paramMap: Record<string, string>, recordId?: string, workFlowSessionId?: string) => {
// workflow 提交时,question 可以为空字符串,但需要传递 paramMap、recordId 和 workFlowSessionId // workflow 提交时,question 可以为空字符串,但需要传递 paramMap、recordId 和 workFlowSessionId
await handleSubmitQuestion(undefined, undefined, undefined, { await handleSubmitQuestion(undefined, undefined, undefined, {
includeQuestion: false, includeQuestion: false,
...@@ -634,7 +634,7 @@ export const TacticsChat: React.FC = () => { ...@@ -634,7 +634,7 @@ export const TacticsChat: React.FC = () => {
workFlowSessionId, workFlowSessionId,
recordType: 'A01', recordType: 'A01',
}) })
} }, [])
/** 获取qa记录 */ /** 获取qa记录 */
const getUserQaRecordPage = useCallback(async (conversationId: string) => { const getUserQaRecordPage = useCallback(async (conversationId: string) => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment