/** * 知识库项目编辑 */ import { Text, View } from "@tarojs/components"; import PageCustom from "@/components/page-custom/index"; import NavBarNormal from "@/components/NavBarNormal/index"; import BottomBar from "@/components/BottomBar"; import IconQ from "@/components/icon/IconQ"; import IconA from "@/components/icon/IconA"; import IconPlusColor14 from "@/components/icon/IconPlusColor14"; import IconALink from "@/components/icon/IconALink"; import IconDeleteGray16 from "@/components/icon/IconDeleteGray16"; import { useEffect, useRef, useState } from "react"; import IconAImage from "@/components/icon/IconAImage"; import WemetaTextarea from "@/components/wemeta-textarea"; import WemetaInput from "@/components/wemeta-input"; import UploaderGrid from '@/components/UploaderGrid' import type { TMediaType } from "@/types/index"; import { uploadFile } from "@/utils/http"; import { EUploadFileScene } from "@/consts/enum"; import Taro, { useRouter } from "@tarojs/taro"; import { isSuccess } from "@/utils"; import { editVisitorDislikeAnswer, getVisitorMessagesByMsgId } from "@/service/visitor"; import { TVisitorChat } from "@/types/visitor"; import { EContentType, TMessageBodyContent } from "@/types/bot"; type TFormdata = {content:string, correctionAnswer: string, links: string[], mediaList: TMediaType[]} export default function Index() { const router = useRouter() const { msgId, visitorId, agentId } = router.params as {msgId: string, visitorId: string, agentId: string} const [visitorQ, setQVisitor] = useState(null) const [visitor, setVisitor] = useState(null) const [isDislike, setIsDislike] = useState(false) const [formData, setFormData] = useState( { content: '', correctionAnswer: '', links: [], mediaList: [] //{fileType: 'image',url: 'https://cdn.wehome.cn/cmn/png/53/META-H8UKWHWU-2JNUAG2BARJF55VHU9QS3-YBQGHDAM-IW.png'} } ); const handleInput = (value: string) => { setFormData({ ...formData, content: value, }); }; const handleValueAInput = (value: string) => { setFormData({ ...formData, correctionAnswer: value, }); }; // 添加链接 const addLink = () => { setFormData({ ...formData, links: [...formData.links, ""], }); }; // 删除链接 const removeLink = (e, index) => { e.stopPropagation(); const newLinks = [...formData.links]; newLinks.splice(index, 1); setFormData({ ...formData, links: newLinks, }); }; // 更新单个链接 const handleLinkChange = (index:number, value: string) => { const newLinks = [...formData.links]; newLinks[index] = value; setFormData({ ...formData, links: newLinks, }); }; const handleDeleteMedia = (index:number) => { setFormData(prev => ({ ...prev, mediaList: prev.mediaList.filter((_, i) => i !== index) })); }; const handleSubmit = async () => { if(!msgId || !visitorId || !visitor){ return } const dataToSubmit = { questions : visitorQ?.content ? [visitorQ?.content] : [], visitorId: visitorId, answer: formData.correctionAnswer, content: formData.content, agentId: agentId, msgId: msgId, correctionId: visitor.correctionId, links: formData.links.filter(link => link.trim() !== ''), pics: formData.mediaList.map( item => item.url), } console.log(dataToSubmit) const {status} = await editVisitorDislikeAnswer(dataToSubmit) if(isSuccess(status)){ Taro.showToast({title: '保存成功', icon: 'success'}) } } const getDetail = async () => { const {status, data} = await getVisitorMessagesByMsgId({ msgId, visitorId, size: 2, }) if(isSuccess(status), data[0]){ const _visitor = data[0] setVisitor(_visitor) if(data[1]){ setQVisitor(data[1]) } setIsDislike(_visitor.isDislike) let content = _visitor.content let links = _visitor.correctionLinks ?? [] let pics = _visitor.correctionPics ?? [] // 特殊处理消息内容 if(_visitor.contentType === EContentType.AiseekQA){ try{ const json = JSON.parse(_visitor.content) as TMessageBodyContent content = json.answer.text links = json.answer.payload.links pics = json.answer.payload.pics }catch(e){} } setFormData({ content: content, correctionAnswer: _visitor.correctionAnswer, links: links, mediaList: pics?.map( pic => { return {fileType: 'image', url: pic} }) ?? [], }) } } const handleChooseMedia = ()=> { Taro.chooseMedia({ count: 10, mediaType: ["image"], sourceType: ["album", "camera"], async success(r) { // const tempFiles = r.tempFiles; for (const tempFile of r.tempFiles){ const result = await uploadFile(tempFile.tempFilePath, EUploadFileScene.OTHER) if(result?.publicUrl){ setFormData(prev => { return {...prev, mediaList: [{fileType:'image', url: result.publicUrl}, ...prev.mediaList]} }) } } } }) } useEffect(()=> { if(visitorId && msgId){ getDetail() } }, [visitorId, msgId]) return ( {isDislike ? '纠错' : '编辑'} {isDislike && 修改后的问答将存入知识库,持续训练提升您的智能体} 提问 {visitorQ?.content} 原回答 {/* 回答 */} 纠错回答 {/* 链接 */} 链接 新增 {formData.links.map((link, index) => { return ( handleLinkChange(index, value)} suffix={() => ( removeLink(e, index)}> )} placeholder="请输入查看链接,支持长按粘贴..." /> ); })} {/* 图片 */} 图片 {}} onDelete={handleDeleteMedia} /> 保存 ); }