'use client' import React, { useEffect, useState } from 'react' import { RiCloseLine } from '@remixicon/react' import Modal from '@/app/components/base/modal' import Button from '@/app/components/base/button' import { addCorpus, addCorpusQuestion, delBatchCorpusQuestion, editCorpus as editCorpusFunc, editCorpusQuestion, fetchCorpusQuestion, fetchIntent, getCorpus, } from '@/service/common' import 'react-multi-email/dist/style.css' import Input from '@/app/components/base/input' import Checkbox from '@/app/components/base/checkbox' import cn from '@/utils/classnames' import { useContext } from 'use-context-selector' import { ToastContext } from '@/app/components/base/toast' import Confirm from '@/app/components/base/confirm' import { Cascader as AntdCascader } from 'antd' import { Textarea } from '@/app/components/base/textarea' const DetailModal = ({ transfer, onCancel, onSend, onRefresh, }: any) => { const { notify } = useContext(ToastContext) const [intentCascader, setIntentCascader] = useState([]) useEffect(() => { fetchIntent({ url: '/intentions', params: { page: 1, limit: 99999, }, }).then((res: any) => { const map = new Map() res.data.forEach((v: any) => { if (map.has(v.type_id)) { const parent = map.get(v.type_id) parent.children.push(v) map.set(v.type_id, parent) } else { map.set(v.type_id, { id: v.type_id, name: v.type_name, children: [v], }) } }) setIntentCascader(Array.from(map.values())) }) }, []) const [question, setQuestion] = useState('') const [intentValue, setIntentValue] = useState([]) const [questionCorpus, setQuestionCorpus] = useState('') const [similarityList, setSimilarityList] = useState([]) const handleSave = async () => { try { let res if (transfer.mode === 'add') { res = await addCorpus({ url: '/intentions/corpus', body: { question, intention_id: intentValue[intentValue.length - 1] }, }) } else { res = await editCorpusFunc({ url: `/intentions/corpus/${transfer.row.id}`, body: { question, intention_id: intentValue[intentValue.length - 1], question_config: questionCorpus }, }) } const { id }: any = res if (id) { if (transfer.mode === 'add') onRefresh(id) else onSend() } } catch (e) { } } useEffect(() => { if (transfer.row?.id) { getCorpus({ url: `/intentions/corpus/${transfer.row.id}` }).then((res: any) => { setQuestion(res.question) setIntentValue([res.intention.type_id, res.intention.id]) setQuestionCorpus(res.question_config || '') setSimilarityList(res.similarity_questions) }) } }, []) const [similarityQuestion, setSimilarityQuestion] = useState('') const [similarityFilter, setSimilarityFilter] = useState('') const refreshSimilarity = async () => { const res = await fetchCorpusQuestion({ url: `/intentions/corpus/${transfer.row.id}/similarity_questions`, params: { page: 1, limit: 99999, }, }) setSimilarityList(res) } const handleAddSimilarity = async () => { if (!similarityQuestion) return if (similarityList.some((v: any) => v.question === similarityQuestion)) { notify({ type: 'warning', message: '请勿新增重复数据!' }) return } const { id }: any = await addCorpusQuestion({ url: `/intentions/corpus/${transfer.row.id}/similarity_questions`, body: { question: similarityQuestion, }, }) if (id) { await refreshSimilarity() setSimilarityQuestion('') } } const [similaritySelectMap, setSimilaritySelectMap] = useState(new Map()) const addSimilaritySelectMap = (key: any, value: any) => { setSimilaritySelectMap((prevMap: any) => { const newMap = new Map(prevMap) newMap.set(key, value) return newMap }) } const delSimilaritySelectMap = (key: any) => { setSimilaritySelectMap((prevMap: any) => { const newMap = new Map(prevMap) newMap.delete(key) return newMap }) } const [similarityRow, setSimilarityRow] = useState({}) const [showSimilarityEdit, setShowSimilarityEdit] = useState(false) const [editSimilarity, setEditSimilarity] = useState('') const [showSimilarityCorpus, setShowSimilarityCorpus] = useState(false) const [editSimilarityCorpus, setEditSimilarityCorpus] = useState('') const handleSaveSimilarity = async () => { if (similarityList.some((v: any) => v.name === editSimilarity)) { notify({ type: 'warning', message: '请勿新增重复数据!' }) return } const params: any = { corpus_id: similarityRow.corpus_id, } if (showSimilarityEdit) { params.question = editSimilarity } else if (showSimilarityCorpus) { params.question = similarityRow.question params.question_config = editSimilarityCorpus } const { id }: any = await editCorpusQuestion({ url: `/intentions/similarity_questions/${similarityRow.id}`, body: params, }) if (id) { await refreshSimilarity() setShowSimilarityEdit(false) setShowSimilarityCorpus(false) } } const [showConfirmDelete, setShowConfirmDelete] = useState(false) const [delBatch, setDelBatch] = useState(false) const handleDelSimilarity = async () => { try { await delBatchCorpusQuestion({ url: '/intentions/similarity_questions/batch', body: { method: 'delete', data: delBatch ? Array.from(similaritySelectMap.keys()) : [similarityRow.id], }, }) setShowConfirmDelete(false) setSimilaritySelectMap(new Map()) refreshSimilarity() } catch (e) { } } const [showCorpus, setShowCorpus] = useState(false) const [editCorpus, setEditCorpus] = useState('') return (
{ }} className="p-[24px 32px] w-[800px] max-w-[800px]">
{transfer.mode === 'add' ? '新增' : '编辑'}语料
标准问题
setQuestion(e.target.value)} onClear={() => setQuestion('')} />
{ transfer.mode === 'edit' && ( ) }
意图名称
{ setIntentValue(val) }} placeholder="请选择" fieldNames={{ label: 'name', value: 'id' }} showSearch={true} />
{ transfer.mode === 'edit' && (
相似问题
setSimilarityQuestion(e.target.value)} onClear={() => setSimilarityQuestion('')} placeholder='输入后Enter以添加' onEnter={handleAddSimilarity} />
) }
{ transfer.mode === 'edit' && (
e.stopPropagation()}> similaritySelectMap.has(v.id))} onCheck={() => { similarityList.every((v: any) => similaritySelectMap.has(v.id)) ? setSimilaritySelectMap(new Map()) : similarityList.forEach((v: any) => addSimilaritySelectMap(v.id, v)) }} disabled={similarityList.length === 0} /> 全选
setSimilarityFilter(e.target.value)} onClear={() => setSimilarityFilter('')} placeholder='请输入相似问题名称进行过滤' />
{ similarityList.filter((v: any) => !similarityFilter || v.question.includes(similarityFilter)).map((item: any) => (
{ similaritySelectMap.has(item.id) ? delSimilaritySelectMap(item.id) : addSimilaritySelectMap(item.id, item) }} disabled={similarityList.length === 0} />
{item.question}
)) }
共{similarityList.length}条
已选择{similaritySelectMap.size}条
) }
{ showSimilarityEdit && ( { }} className="p-[24px 32px] w-[400px]">
编辑相似问题
setShowSimilarityEdit(false)} />
相似问题
setEditSimilarity(e.target.value)} className='h-9' placeholder='请输入相似问题' />
) } {showConfirmDelete && ( setShowConfirmDelete(false)} /> )} { showCorpus && ( { }} className="p-[24px 32px] max-w-[800px]">
训练语料配置
setShowCorpus(false)} />
当前标注问题:{question}