浏览代码

知识服务

CzRger 5 月之前
父节点
当前提交
ca478ab28a

+ 17 - 18
web/app/components/header/account-setting/knowledges-page/detail-modal/index.tsx

@@ -15,39 +15,38 @@ const InviteModal = ({
   onCancel,
   onSend,
 }: any) => {
-  const [serviceType, setServiceType] = useState<any>(transfer.row?.serviceType || '')
-  const [serviceName, setServiceName] = useState<string>(transfer.row?.serviceName || '')
+  const [type, setType] = useState<any>(transfer.row?.type || '')
+  const [name, setName] = useState<string>(transfer.row?.name || '')
   const [url, setUrl] = useState<string>(transfer.row?.url || '')
   const [method, setMethod] = useState<string>(transfer.row?.method || '')
   const options = [
-    { name: '智能问答', value: 1 },
-    { name: '智能搜索', value: 2 },
-    { name: '智能推荐', value: 3 },
+    { name: '智能问答', value: 'QUESTION_ANSWER' },
+    { name: '智能搜索', value: 'SEARCH' },
+    { name: '智能推荐', value: 'RECOMMEND' },
   ]
   const handleSave = useCallback(async () => {
     try {
       let res: any = () => {}
       if (transfer.mode === 'add') {
         res = await addKnowledge({
-          url: '/workspaces/123123',
-          body: { serviceType, serviceName, url, method },
+          url: '/external_applications',
+          body: { type, name, url, method, status: false },
         })
       }
       else {
         res = await editKnowledge({
-          url: '/workspaces/123123',
-          body: { id: transfer.id, serviceType, serviceName, url, method },
+          url: `/external_applications/${transfer.row.id}`,
+          body: { type, name, url, method },
         })
       }
-      const { result }: any = res
-      console.log(result)
-      if (result === 'success') {
+      const { id }: any = res
+      if (id) {
         onCancel()
         onSend()
       }
     }
     catch (e) { }
-  }, [serviceType, serviceName, url, method, onCancel, onSend, transfer])
+  }, [type, name, url, method, onCancel, onSend, transfer])
 
   return (
     <div className={cn(s.wrap)}>
@@ -63,8 +62,8 @@ const InviteModal = ({
             </div>
             <div className='w-full'>
               <SimpleSelect
-                defaultValue={serviceType}
-                onSelect={(i) => { setServiceType(i.value) }}
+                defaultValue={type}
+                onSelect={(i) => { setType(i.value) }}
                 items={options}
                 allowSearch={false}
               />
@@ -75,8 +74,8 @@ const InviteModal = ({
               系统名称
             </div>
             <Input
-              value={serviceName}
-              onChange={e => setServiceName(e.target.value)}
+              value={name}
+              onChange={e => setName(e.target.value)}
               className='h-9'
               placeholder='请输入系统名称'
             />
@@ -107,7 +106,7 @@ const InviteModal = ({
             tabIndex={0}
             className='mt-4 w-full'
             onClick={handleSave}
-            disabled={!serviceType.length || !serviceName.length || !url.length || !method.length}
+            disabled={!type.length || !name.length || !url.length || !method.length}
             variant='primary'
           >
             保存

+ 41 - 12
web/app/components/header/account-setting/knowledges-page/index.tsx

@@ -8,7 +8,7 @@ import DetailModal from './detail-modal'
 import { useContext } from 'use-context-selector'
 import { RiAddLine } from '@remixicon/react'
 import { useTranslation } from 'react-i18next'
-import { fetchKnowledges } from '@/service/common'
+import { delKnowledge, fetchKnowledges } from '@/service/common'
 import I18n from '@/context/i18n'
 import { useAppContext } from '@/context/app-context'
 import LogoEmbeddedChatHeader from '@/app/components/base/logo/logo-embedded-chat-header'
@@ -19,19 +19,23 @@ import UpgradeBtn from '@/app/components/billing/upgrade-btn'
 import { NUM_INFINITE } from '@/app/components/billing/config'
 import { LanguagesSupported } from '@/i18n/language'
 import cn from '@/utils/classnames'
+import Confirm from '@/app/components/base/confirm'
+import useTimestamp from '@/hooks/use-timestamp'
 dayjs.extend(relativeTime)
 
 const KnowledgesPage = () => {
   const { t } = useTranslation()
   const { locale } = useContext(I18n)
+  const { formatTime } = useTimestamp()
+
   const ServiceTypeMap: any = {
-    1: '智能问答',
-    2: '智能搜索',
-    3: '智能推荐',
+    QUESTION_ANSWER: '智能问答',
+    SEARCH: '智能搜索',
+    RECOMMEND: '智能推荐',
   }
   const StatusMap: any = {
-    0: '未启用',
-    1: '已启用',
+    false: '未启用',
+    true: '已启用',
   }
   const { userProfile, currentWorkspace, isCurrentWorkspaceOwner, isCurrentWorkspaceManager, systemFeatures } = useAppContext()
   const { data, mutate }: any = useSWR(
@@ -47,13 +51,26 @@ const KnowledgesPage = () => {
   const [detailModalVisible, setDetailModalVisible] = useState(false)
   const [transfer, setTransfer] = useState<any>({
     mode: 'add',
-    id: null,
+    row: null,
   })
   const knowledgeList = data?.data || []
   const { plan, enableBilling } = useProviderContext()
   const isNotUnlimitedMemberPlan = enableBilling && plan.type !== Plan.team && plan.type !== Plan.enterprise
   const isMemberFull = enableBilling && isNotUnlimitedMemberPlan && knowledgeList.length >= plan.total.teamMembers
 
+  const [showConfirmDelete, setShowConfirmDelete] = useState(false)
+  const [row, setRow] = useState<any>({})
+  const handleDel = async () => {
+    try {
+      await delKnowledge({
+        url: `/external_applications/${row.id}`,
+        body: {},
+      })
+      setShowConfirmDelete(false)
+      mutate()
+    }
+    catch (e) { }
+  }
   return (
     <>
       <div className='flex flex-col'>
@@ -106,11 +123,11 @@ const KnowledgesPage = () => {
             {
               knowledgeList.map((know: any) => (
                 <div key={know.id} className='flex justify-between border-b border-divider-subtle'>
-                  <div className='system-sm-regular w-[100px] shrink-0 py-2 text-center text-text-secondary'>{ServiceTypeMap[Number(know.serviceType)]}</div>
-                  <div className='system-sm-regular shrink-0 grow py-2 text-center text-text-secondary'>{know.serviceName}</div>
+                  <div className='system-sm-regular w-[100px] shrink-0 py-2 text-center text-text-secondary'>{ServiceTypeMap[know.type]}</div>
+                  <div className='system-sm-regular shrink-0 grow py-2 text-center text-text-secondary'>{know.name}</div>
                   <div className='system-sm-regular shrink-0 grow py-2 text-center text-text-secondary'>{know.url}</div>
-                  <div className='system-sm-regular w-[80px] shrink-0 py-2 text-center text-text-secondary'>{StatusMap[Number(know.status)]}</div>
-                  <div className='system-sm-regular w-[160px] shrink-0 py-2 text-center text-text-secondary'>{know.time}</div>
+                  <div className='system-sm-regular w-[80px] shrink-0 py-2 text-center text-text-secondary'>{StatusMap[know.status]}</div>
+                  <div className='system-sm-regular w-[160px] shrink-0 py-2 text-center text-text-secondary'>{formatTime(know.updated_at, t('appLog.dateTimeFormat') as string)}</div>
                   <div className='flex w-[120px] shrink-0 items-center justify-center'>
                     <Button variant='ghost-accent' size='small' className={cn('shrink-0')} disabled={!isCurrentWorkspaceManager || isMemberFull}
                       onClick={() => {
@@ -123,7 +140,10 @@ const KnowledgesPage = () => {
                       <RiAddLine className='mr-1 h-4 w-4' />
                       编辑
                     </Button>
-                    <Button variant='ghost' size='small' className={cn('shrink-0 text-red-600')} disabled={!isCurrentWorkspaceManager || isMemberFull} onClick={() => setDetailModalVisible(true)}>
+                    <Button variant='ghost' size='small' className={cn('shrink-0 text-red-600')} disabled={!isCurrentWorkspaceManager || isMemberFull} onClick={() => {
+                      setRow(know)
+                      setShowConfirmDelete(true)
+                    }}>
                       <RiAddLine className='mr-1 h-4 w-4' />
                       刪除
                     </Button>
@@ -145,6 +165,15 @@ const KnowledgesPage = () => {
           />
         )
       }
+      {showConfirmDelete && (
+        <Confirm
+          title="删除确认"
+          content={`请确认是否删除${row.name}?`}
+          isShow={showConfirmDelete}
+          onConfirm={handleDel}
+          onCancel={() => setShowConfirmDelete(false)}
+        />
+      )}
     </>
   )
 }

+ 9 - 18
web/service/common.ts

@@ -207,27 +207,18 @@ export const delType = ({ url, body }: any) => {
 }
 
 export const addKnowledge = ({ url, body }: any) => {
-  // return post<InvitationResponse>(url, { body })
-  console.log('新增知识', body)
-  return new Promise((resolve) => {
-    setTimeout(() => {
-      resolve({
-        result: 'success',
-      })
-    }, 1000)
-  })
+  console.log('新增知识', body, url)
+  return post(url, { body })
 }
 
 export const editKnowledge = ({ url, body }: any) => {
-  // return post<InvitationResponse>(url, { body })
-  console.log('编辑知识', body)
-  return new Promise((resolve) => {
-    setTimeout(() => {
-      resolve({
-        result: 'success',
-      })
-    }, 1000)
-  })
+  console.log('编辑知识', body, url)
+  return patch(url, { body })
+}
+
+export const delKnowledge = ({ url, body }: any) => {
+  console.log('删除知识', url, body)
+  return del(url, { body })
 }
 
 export const addMouldFile = ({ url, body }: any) => {