| <template> | 
|   <div class="container"> | 
|     <Breadcrumb :items="['dmx.list.index', 'dmx.list.kbm']" /> | 
|     <div class="main-container"> | 
|       <div class="lf-container"> | 
|         <div class="lf-container-top"> | 
|           <a-input-search | 
|             :placeholder="$t('cardList.searchInput.placeholder')" | 
|             style="width: 130px;" | 
|           /> | 
|           <addKnow @knowledgeData="knowledgeData"></addKnow> | 
|         </div> | 
|         <div class="lf-container-down"> | 
|           <a-scrollbar style="height:56rem;overflow: auto;"> | 
|             <div | 
|               class="tab" | 
|               v-for="(tab, index) in tabs" | 
|               :key="index" | 
|               @click="selectTab(index,tab)" | 
|               :class="{ 'active': selectedTab === index }" | 
|             > | 
|               {{ tab.name }} | 
|               <a-popover position="bl"> | 
|                 <icon-more  :style="{position: 'absolute',top:'10px',right:'20px'}"/> | 
|                 <template #content> | 
|                   <a-popconfirm content="确定删除吗?" @ok="deleteKnowledge(tab.id)" type="warning"> | 
|                     <span style="cursor: pointer;color: #0960bd;font-size: 12px"><icon-delete />删除</span> | 
|                   </a-popconfirm> | 
|                 </template> | 
|               </a-popover> | 
|             </div> | 
|           </a-scrollbar> | 
|           </div> | 
|       </div> | 
|       <div class="rt-container"> | 
|         <a-tabs default-active-key="1"> | 
|           <a-tab-pane key="1" :title= "t('dmx.list.DataSet')"> | 
|             <div class="rt-container-main"> | 
|               <a-card  ref="account" class="general-card" title="" style="padding-top: 20px"> | 
|                 <a-row> | 
|                   <a-col :flex="1" :span="12"> | 
|                     <a-form | 
|                       :model="formModel" | 
|                       :label-col-props="{ span: 6 }" | 
|                       :wrapper-col-props="{ span: 18 }" | 
|                       label-align="left" | 
|                     > | 
|                       <a-row :gutter="16"> | 
|                         <a-col :span="24" style="margin-bottom: 10px;display: flex;justify-content: right"> | 
|                           <a-input-search | 
|                             :placeholder="$t('cardList.searchInput.placeholder')" | 
|                             style="width: 200px;margin-right: 10px" | 
|                             v-model="keywords" | 
|                             @change="search" | 
|                           /> | 
|                           <!--新建--> | 
|                           <span v-if="tabs.length > 0"> | 
|                             <add :kbobj="kbobj" @changeFetchData="changeFetchData"/> | 
|                           </span> | 
|                         </a-col> | 
|                       </a-row> | 
|                     </a-form> | 
|                   </a-col> | 
|                 </a-row> | 
|                 <a-divider style="margin-top: 0" /> | 
|                 <a-row style="margin-bottom: 16px"> | 
|                   <a-col :span="12"> | 
|                     <a-space> | 
|                       <!--            <a-button type="primary"  @click="handleClick">--> | 
|                       <!--              <template #icon>--> | 
|                       <!--                <icon-plus />--> | 
|                       <!--              </template>--> | 
|                       <!--              {{ $t('searchTable.operation.create') }}--> | 
|                       <!--            </a-button>--> | 
|                       <!--            <a-upload action="/">--> | 
|                       <!--              <template #upload-button>--> | 
|                       <!--                <a-button>--> | 
|                       <!--                  {{ $t('searchTable.operation.import') }}--> | 
|                       <!--                </a-button>--> | 
|                       <!--              </template>--> | 
|                       <!--            </a-upload>--> | 
|                     </a-space> | 
|                   </a-col> | 
|                   <a-col | 
|                     :span="12" | 
|                     style="display: flex; align-items: center; justify-content: end" | 
|                   > | 
|                     <!--          <a-button>--> | 
|                     <!--            <template #icon>--> | 
|                     <!--              <icon-download />--> | 
|                     <!--            </template>--> | 
|                     <!--            {{ $t('searchTable.operation.download') }}--> | 
|                     <!--          </a-button>--> | 
|                     <a-tooltip :content="$t('searchTable.actions.refresh')"> | 
|                       <div class="action-icon" | 
|                       ><icon-refresh size="18" | 
|                       /></div> | 
|                     </a-tooltip> | 
|                     <a-dropdown @select="handleSelectDensity"> | 
|                       <a-tooltip :content="$t('searchTable.actions.density')"> | 
|                         <div class="action-icon"><icon-line-height size="18" /></div> | 
|                       </a-tooltip> | 
|                       <template #content> | 
|                         <a-doption | 
|                           v-for="item in densityList" | 
|                           :key="item.value" | 
|                           :value="item.value" | 
|                           :class="{ active: item.value === size }" | 
|                         > | 
|                           <span>{{ item.name }}</span> | 
|                         </a-doption> | 
|                       </template> | 
|                     </a-dropdown> | 
|                     <!--          <a-tooltip :content="$t('searchTable.actions.columnSetting')">--> | 
|                     <!--            <a-popover--> | 
|                     <!--              trigger="click"--> | 
|                     <!--              position="bl"--> | 
|                     <!--              @popup-visible-change="popupVisibleChange"--> | 
|                     <!--            >--> | 
|                     <!--              <div class="action-icon"><icon-settings size="18" /></div>--> | 
|                     <!--              <template #content>--> | 
|                     <!--                <div id="tableSetting">--> | 
|                     <!--                  <div--> | 
|                     <!--                    v-for="(item, index) in showColumns"--> | 
|                     <!--                    :key="item.dataIndex"--> | 
|                     <!--                    class="setting"--> | 
|                     <!--                  >--> | 
|                     <!--                    <div style="margin-right: 4px; cursor: move">--> | 
|                     <!--                      <icon-drag-arrow />--> | 
|                     <!--                    </div>--> | 
|                     <!--                    <div>--> | 
|                     <!--                      <a-checkbox--> | 
|                     <!--                        v-model="item.checked"--> | 
|                     <!--                        @change="--> | 
|                     <!--                          handleChange($event, item as TableColumnData, index)--> | 
|                     <!--                        "--> | 
|                     <!--                      >--> | 
|                     <!--                      </a-checkbox>--> | 
|                     <!--                    </div>--> | 
|                     <!--                    <div class="title">--> | 
|                     <!--                      {{ item.title === '#' ? '序列号' : item.title }}--> | 
|                     <!--                    </div>--> | 
|                     <!--                  </div>--> | 
|                     <!--                </div>--> | 
|                     <!--              </template>--> | 
|                     <!--            </a-popover>--> | 
|                     <!--          </a-tooltip>--> | 
|                   </a-col> | 
|                 </a-row> | 
|                 <a-table | 
|                   row-key="id" | 
|                   :loading="loading" | 
|                   :pagination="pagination" | 
|                   :columns="cloneColumns" | 
|                   :data="renderData" | 
|                   :bordered="false" | 
|                   :size="size" | 
|                   @page-change="onPageChange" | 
|                   :scroll="{ y: 580 }" | 
|                 > | 
|                   <template #name="{ record }"> | 
| <!--                    <icon-file style="color: #0960bd;margin-right: 4px;" />--> | 
|                     <icon-file style="margin-right: 4px;" /> | 
| <!--                    <span style="color: #0960bd;cursor: pointer" @click="fileClick">--> | 
| <!--                      {{record.name}}--> | 
| <!--                    </span>--> | 
|                     {{record.name}} | 
|                   </template> | 
|                   <template #create_time="{ record }"> | 
|                     <span>{{parseTime(record.create_time)}}</span> | 
|                   </template> | 
| <!--                  <template #parser_id="{ record }">--> | 
| <!--                    <span>{{ parser_ids[record.parser_id]}}</span>--> | 
| <!--                  </template>--> | 
|                   <template #status="{ record }"> | 
|                     <a-switch v-model="record.status" size="small" checked-value="1" unchecked-value="0" @change="handleChangeStatus(record)"/> | 
|                   </template> | 
|                   <template #run="{ record }"> | 
|                     <div style="display: flex;align-items: center;"> | 
|                       <div style="width: 100px"> | 
|                         <a-popover title="Title" v-if="record.run == '4'"> | 
|                           <a-tag  :loading="record.loading" :color="'blue'" border>{{$t('dmx.list.complete')}}</a-tag> | 
|                           <template #content> | 
|                             <p></p> | 
|                           </template> | 
|                         </a-popover> | 
|                         <a-popover title="Title" v-if="record.run == '3'"> | 
|                           <a-tag  :loading="record.loading" :color="'blue'" border>{{$t('dmx.list.complete')}}</a-tag> | 
|                           <template #content> | 
|                             <p></p> | 
|                           </template> | 
|                         </a-popover> | 
|                         <a-popover title="Title" v-if="record.run == '1'"> | 
|                           <a-tag :loading="record.loading"  :color="'blue'" border>{{$t('dmx.list.complete')}}</a-tag> | 
|                           <template #content> | 
|                             <p></p> | 
|                           </template> | 
|                         </a-popover> | 
|                         <a-popover title="Title" v-if="record.run == '2'"> | 
|                           <a-tag :loading="record.loading"  :color="'gold'" border>{{$t('dmx.list.cancel')}}</a-tag> | 
|                           <template #content> | 
|                             <p></p> | 
|                           </template> | 
|                         </a-popover> | 
|                         <a-popover title="Title" v-if="record.run == '0'"> | 
|                           <a-tag :loading="record.loading"  :color="'green'" border>{{$t('dmx.list.NotStarted')}}</a-tag> | 
|                           <template #content> | 
|                             <p></p> | 
|                           </template> | 
|                         </a-popover> | 
|                       </div> | 
|                       <div > | 
|                         <a-button type="text" size="large" @click="run(record)" :loading="record.loading"> | 
|                           <template #icon> | 
|                             <icon-sync  v-if="record.run == '4'"/> | 
|                             <icon-sync  v-if="record.run == '3'"/> | 
|                             <icon-sync  v-if="record.run == '2'"/> | 
|                             <icon-sync style="color: green"  v-if="record.run == '1'"/> | 
|                             <icon-play-circle style="color: green"  v-if="record.run == '0'"/> | 
|                           </template> | 
|                         </a-button> | 
|                       </div> | 
|                     </div> | 
|                   </template> | 
|                   <template #action="{ record }" > | 
|                     <tool :kbtenantInfo="kbtenantInfo" :item="record" :kbdetail="kbdetail" /> | 
|                     <edit :item="record" @upTabdateItem="upTabdateItem"/> | 
|                     <a-popconfirm :content="'确定删除吗'" type="warning" @ok="deleteItem(record)"> | 
|                       <a-button  type="text" size="small"> | 
|                         <template #icon> | 
|                           <icon-delete /> | 
|                         </template> | 
|                       </a-button> | 
|                     </a-popconfirm> | 
|                     <a-button type="text" size="small" @click="onDownloadDocument(record)"> | 
|                       <template #icon> | 
|                         <icon-download /> | 
|                       </template> | 
|                     </a-button> | 
|   | 
|                     <a-button type="text" size="small"  @click="seeload(record)"> | 
|                       <template #icon> | 
|                         <icon-eye /> | 
|                       </template> | 
|                     </a-button> | 
|   | 
|                   </template> | 
|                 </a-table> | 
|               </a-card> | 
|             </div> | 
|           </a-tab-pane> | 
|           <a-tab-pane key="2" :title="t('dmx.list.test')"> | 
|             <div class="rt-container-main"> | 
|               <test ref="testForm"></test> | 
|             </div> | 
|           </a-tab-pane> | 
|           <a-tab-pane key="3" :title="t('dmx.list.disposition')"> | 
|             <div class="rt-container-main"> | 
|               <config ref="configForm" :kbtenantInfo="kbtenantInfo"  :kbobj="kbobj"></config> | 
|             </div> | 
|           </a-tab-pane> | 
|         </a-tabs> | 
| <!--        <div v-if="detailsShow" class="details">--> | 
| <!--          <div class="details-header">--> | 
| <!--            <div style="display: flex;align-items: center">--> | 
| <!--              <span><icon-arrow-left size="20px" style="cursor: pointer;color: #0960bd;margin: 10px" @click="goBackClick" /></span>--> | 
| <!--              <icon-file style="color: #0960bd;margin-right: 4px;" />--> | 
| <!--              <span style="">123.docx</span>--> | 
| <!--            </div>--> | 
| <!--            <div style="display: flex; align-items: center;">--> | 
| <!--              <a-radio-group v-model="position" type="button" style="margin-right: 10px">--> | 
| <!--                <a-radio value="top">{{'dmx.list.EntireArticle'}}</a-radio>--> | 
| <!--                <a-radio value="right">{{'dmx.list.omit'}}</a-radio>--> | 
| <!--              </a-radio-group>--> | 
| <!--              <a-popover position="bottom">--> | 
| <!--                <a-button type="outline" class="button" style="margin-right: 10px">{{'dmx.list.batch'}} <icon-down style="margin-left: 4px" /></a-button>--> | 
| <!--                <template #content>--> | 
| <!--                  <p>Here is the text content</p>--> | 
| <!--                  <p>Here is the text content</p>--> | 
| <!--                </template>--> | 
| <!--              </a-popover>--> | 
| <!--              <a-button type="outline" class="button" style="margin-right: 10px">--> | 
| <!--                <template #icon>--> | 
| <!--                  <icon-search />--> | 
| <!--                </template>--> | 
| <!--              </a-button>--> | 
| <!--              <a-popover position="bottom">--> | 
| <!--                <a-button type="outline" class="button" style="margin-right: 10px"><icon-sort /></a-button>--> | 
| <!--                <template #content>--> | 
| <!--                  <p>Here is the text content</p>--> | 
| <!--                  <p>Here is the text content</p>--> | 
| <!--                </template>--> | 
| <!--              </a-popover>--> | 
| <!--              <addDetails></addDetails>--> | 
| <!--            </div>--> | 
| <!--          </div>--> | 
| <!--          <a-divider style="margin-top: 10px" />--> | 
| <!--        </div>--> | 
|       </div> | 
|     </div> | 
|     <a-modal title=" " v-model:visible="visible" :footer="false" fullscreen> | 
| <!--      <docx v-if="documenttype=='docx'" previewSrc="http://192.168.20.116:1080/v1/document/get/405c3efa4d8c11ef97560242ac120006"></docx>--> | 
|       <docx v-if="documenttype=='docx'" :previewSrc="previewSrc"></docx> | 
|       <excel v-if="documenttype=='excel'" :previewSrc="previewSrc"></excel> | 
|       <txtPdf v-if="documenttype=='txtPdf'" :previewSrc="previewSrc"></txtPdf> | 
|     </a-modal> | 
|   </div> | 
| </template> | 
|   | 
| <script lang="ts" setup> | 
| import { computed, ref, reactive, watch, nextTick, onBeforeMount, onMounted } from "vue"; | 
|   import { useI18n } from 'vue-i18n'; | 
|   import useLoading from '@/hooks/loading'; | 
| import { | 
|   queryKbList, | 
|   PolicyRecord, | 
|   PolicyParams, | 
|   queryKbDocumentList, | 
|   deleteKnow, | 
|   queryKbdetail, | 
|   queryKbtenantInfo, kbdocumentrm, kbdocumentchangeparser, kbdocumentrun, kbdocumentchangeStatus,downloadFile | 
| } from "@/api/kbList"; | 
|   import { Pagination } from '@/types/global'; | 
|   import type { SelectOptionData } from '@arco-design/web-vue/es/select/interface'; | 
|   import type { TableColumnData } from '@arco-design/web-vue/es/table/interface'; | 
|   import cloneDeep from 'lodash/cloneDeep'; | 
|   import Sortable from 'sortablejs'; | 
|   import add from '@/views/dmx/knowledgeLib/add.vue' | 
|   import edit from '@/views/dmx/knowledgeLib/edit.vue' | 
|   import addKnow from '@/views/dmx/knowledgeLib/addKnow.vue' | 
|   import config from '@/views/dmx/knowledgeLib/config.vue' | 
|   import test from '@/views/dmx/knowledgeLib/test.vue' | 
|   import tool from '@/views/dmx/knowledgeLib/tool.vue' | 
|   import docx from '@/views/dmx/knowledgeLib/components/docx.vue' | 
|   import excel from '@/views/dmx/knowledgeLib/components/excel.vue' | 
|   import txtPdf from '@/views/dmx/knowledgeLib/components/txtPdf.vue' | 
|   import { Message } from "@arco-design/web-vue"; | 
|   import { parseTime } from "@/utils"; | 
|   type SizeProps = 'mini' | 'small' | 'medium' | 'large'; | 
|   type Column = TableColumnData & { checked?: true }; | 
|   const account = ref(null) | 
|   const generateFormModel = () => { | 
|     return { | 
|       number: '', | 
|       name: '', | 
|       contentType: '', | 
|       filterType: '', | 
|       createdTime: [], | 
|       status: '', | 
|     }; | 
|   }; | 
|   const { loading, setLoading } = useLoading(true); | 
|   const { t } = useI18n(); | 
|   const renderData = ref([]); | 
|   const formModel = ref(generateFormModel()); | 
|   const cloneColumns = ref([]); | 
|   const showColumns = ref<Column[]>([]); | 
|   | 
|   const size = ref<SizeProps>('medium'); | 
|   let visible = ref(false) | 
|   let keywords = ref('') | 
|   let detailsShow = ref(false) | 
|   let selectedTab = ref(0) | 
|   let testForm = ref(null) | 
|   let configForm = ref(null) | 
|   let documenttype = ref('docx') | 
|   let previewSrc = ref('') | 
|   let kbId = ref('') | 
|   let kbobj = reactive({}) | 
|   let kbdetail = reactive({}) | 
|   let parser_ids = reactive({}) | 
|   let seeObj = reactive({}) | 
|   let kbtenantInfo = reactive({ | 
|     "asr_id": "paraformer-realtime-8k-v1", | 
|     "embd_id": "BAAI/bge-large-zh-v1.5", | 
|     "img2txt_id": "qwen-vl-max", | 
|     "llm_id": "qwen-plus", | 
|     "name": "wanghao‘s Kingdom", | 
|     "parser_ids": "naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One", | 
|     "rerank_id": "BAAI/bge-reranker-v2-m3", | 
|     "role": "owner", | 
|     "tenant_id": "948fc6fa41ab11ef8fb80242ac120004", | 
|     parser_idObj:{} | 
|   }) | 
|   let tabs = ref([]) | 
|   | 
|   const  selectTab = (index,item) => { | 
|     selectedTab.value= index; | 
|     // console.log(item.id); | 
|     kbobj= item; | 
|     kbId = kbobj.id; | 
|     testForm.value.changekbid(kbId); | 
|     configForm.value.changekbObj(kbobj); | 
|     fetchData({ | 
|       kb_id: kbobj.id, | 
|       page: 1, | 
|       page_size: 20 | 
|     }) | 
|   } | 
|   | 
|   const basePagination: Pagination = { | 
|     current: 1, | 
|     pageSize: 20, | 
|   }; | 
|   const pagination = reactive({ | 
|     ...basePagination, | 
|   }); | 
|   const densityList = computed(() => [ | 
|     { | 
|       name: t('searchTable.size.mini'), | 
|       value: 'mini', | 
|     }, | 
|     { | 
|       name: t('searchTable.size.small'), | 
|       value: 'small', | 
|     }, | 
|     { | 
|       name: t('searchTable.size.medium'), | 
|       value: 'medium', | 
|     }, | 
|     { | 
|       name: t('searchTable.size.large'), | 
|       value: 'large', | 
|     }, | 
|   ]); | 
|   const columns = computed<TableColumnData[]>(() => [ | 
|     { | 
|       title: t('dmx.column.name'), | 
|       dataIndex: 'name', | 
|       slotName: 'name', | 
|     }, | 
|     { | 
|       title: t('分快数'), | 
|       dataIndex: 'chunk_num', | 
|     }, | 
|     { | 
|       title: t('dmx.column.UploadTime'), | 
|       dataIndex: 'create_time', | 
|       slotName: 'create_time', | 
|       width:200 | 
|     }, | 
|     { | 
|       title: t('解析方法'), | 
|       dataIndex: 'parser_id', | 
|       slotName: 'parser_id', | 
|     }, | 
|     { | 
|       title: t('启用'), | 
|       dataIndex: 'status', | 
|       slotName: 'status', | 
|     }, | 
|     { | 
|       title: t('解析状态'), | 
|       dataIndex: 'run', | 
|       slotName: 'run', | 
|     }, | 
|     { | 
|       title: t('dmx.column.Operate'), | 
|       dataIndex: 'action', | 
|       slotName: 'action', | 
|       width: 200, | 
|       minWidth: 200, | 
|     }, | 
|   ]); | 
|   const contentTypeOptions = computed<SelectOptionData[]>(() => [ | 
|     { | 
|       label: t('searchTable.form.contentType.img'), | 
|       value: 'img', | 
|     }, | 
|     { | 
|       label: t('searchTable.form.contentType.horizontalVideo'), | 
|       value: 'horizontalVideo', | 
|     }, | 
|     { | 
|       label: t('searchTable.form.contentType.verticalVideo'), | 
|       value: 'verticalVideo', | 
|     }, | 
|   ]); | 
|   const filterTypeOptions = computed<SelectOptionData[]>(() => [ | 
|     { | 
|       label: t('searchTable.form.filterType.artificial'), | 
|       value: 'artificial', | 
|     }, | 
|     { | 
|       label: t('searchTable.form.filterType.rules'), | 
|       value: 'rules', | 
|     }, | 
|   ]); | 
|   const statusOptions = computed<SelectOptionData[]>(() => [ | 
|     { | 
|       label: t('searchTable.form.status.online'), | 
|       value: 'online', | 
|     }, | 
|     { | 
|       label: t('searchTable.form.status.offline'), | 
|       value: 'offline', | 
|     }, | 
|   ]); | 
|   const fetchData = async (params) => { | 
|     setLoading(true); | 
|     try { | 
|       const  data  = await queryKbDocumentList(params); | 
|       console.log(data, 'data'); | 
|       if(data.code=='0'){ | 
|         //   详情 | 
|         // const  kbtenantInfo  = await queryKbtenantInfo(); | 
|         parser_ids = kbtenantInfo.parser_ids.split(',').reduce((acc, pair) => { | 
|           const [key, value] = pair.split(':'); | 
|           acc[key] = value; | 
|           return acc; | 
|         }, {}); | 
|         // console.log(parser_ids, 'parser_ids'); | 
|         kbtenantInfo.parser_idObj = parser_ids; | 
|         renderData.value = data.data.docs||[]; | 
|         renderData.value = renderData.value.map((item) => { | 
|           return { | 
|             ...item, | 
|             loading: false, | 
|             parser_id: parser_ids[item.parser_id], | 
|           }; | 
|         }); | 
|         console.log(renderData.value, 'renderData'); | 
|   | 
|         pagination.current = params.page; | 
|         pagination.total = data.data.total; | 
|         //   查询知识库详情 | 
|         // kbdetail  = await queryKbdetail({ | 
|         //   kb_id:params.kb_id, | 
|         // }); | 
|   | 
|       } | 
|     } catch (err) { | 
|       // you can report use errorHandler or other | 
|     } finally { | 
|       setLoading(false); | 
|     } | 
|   }; | 
|   | 
|   const search = () => { | 
|     fetchData({ | 
|       kb_id: kbobj.id, | 
|       page: 1, | 
|       page_size: 20, | 
|       keywords:keywords.value | 
|     }) | 
|   }; | 
|   | 
|   const handleClick = ()=>{ | 
|     visible.value = true; | 
|   } | 
|   | 
|   const onPageChange = (current: number) => { | 
|     fetchData({ ...basePagination, current }); | 
|   }; | 
|   | 
|   const knowledgeData = async ( | 
|     params = { page: 1, page_size: 20 } | 
|   ) => { | 
|     setLoading(true); | 
|     try { | 
|       const { data } = await queryKbList(params); | 
|       console.log(data, 'data'); | 
|       tabs.value = data; | 
|       console.log(tabs.value, 'tabs'); | 
|       if(tabs.value.length>0 && tabs.value[0]){ | 
|         kbobj = tabs.value[0] | 
|         kbId = kbobj.id; | 
|         testForm.value.changekbid(kbId); | 
|         configForm.value.changekbObj(kbobj); | 
|         fetchData({ | 
|           kb_id: kbobj.id, | 
|           page: 1, | 
|           page_size: 20 | 
|         }) | 
|       } | 
|       // renderData.value = data.list; | 
|       // console.log(renderData, 'renderData'); | 
|       // pagination.current = params.current; | 
|       // pagination.total = data.total; | 
|     } catch (err) { | 
|       // you can report use errorHandler or other | 
|     } finally { | 
|       setLoading(false); | 
|     } | 
|   }; | 
|   | 
|   const deleteKnowledge = async (id) => { | 
|     let data = await deleteKnow({ | 
|       kb_id:id | 
|     }) | 
|     if(data.code == 0){ | 
|       Message.success('删除成功'); | 
|       knowledgeData() | 
|     } | 
|   } | 
|   const reset = () => { | 
|     formModel.value = generateFormModel(); | 
|   }; | 
|   | 
|   const handleSelectDensity = ( | 
|     val: string | number | Record<string, any> | undefined, | 
|     e: Event | 
|   ) => { | 
|     size.value = val as SizeProps; | 
|   }; | 
|   | 
|   const handleChange = ( | 
|     checked: boolean | (string | boolean | number)[], | 
|     column: Column, | 
|     index: number | 
|   ) => { | 
|     if (!checked) { | 
|       cloneColumns.value = showColumns.value.filter( | 
|         (item) => item.dataIndex !== column.dataIndex | 
|       ); | 
|     } else { | 
|       cloneColumns.value.splice(index, 0, column); | 
|     } | 
|   }; | 
|   | 
|   const exchangeArray = <T extends Array<any>>( | 
|     array: T, | 
|     beforeIdx: number, | 
|     newIdx: number, | 
|     isDeep = false | 
|   ): T => { | 
|     const newArray = isDeep ? cloneDeep(array) : array; | 
|     if (beforeIdx > -1 && newIdx > -1) { | 
|       // 先替换后面的,然后拿到替换的结果替换前面的 | 
|       newArray.splice( | 
|         beforeIdx, | 
|         1, | 
|         newArray.splice(newIdx, 1, newArray[beforeIdx]).pop() | 
|       ); | 
|     } | 
|     return newArray; | 
|   }; | 
|   | 
|   const popupVisibleChange = (val: boolean) => { | 
|     if (val) { | 
|       nextTick(() => { | 
|         const el = document.getElementById('tableSetting') as HTMLElement; | 
|         const sortable = new Sortable(el, { | 
|           onEnd(e: any) { | 
|             const { oldIndex, newIndex } = e; | 
|             exchangeArray(cloneColumns.value, oldIndex, newIndex); | 
|             exchangeArray(showColumns.value, oldIndex, newIndex); | 
|           }, | 
|         }); | 
|       }); | 
|     } | 
|   }; | 
|   | 
|   const fileClick = ()=>{ | 
|     detailsShow.value = true | 
|   | 
|   } | 
|   | 
|   const goBackClick = ()=>{ | 
|     detailsShow.value = false | 
|   | 
|   } | 
|   function upTabdateItem(id, newName) { | 
|     console.log(id, newName); | 
|     const itemToUpdate = renderData.value.find(item => item.id === id); | 
|     if (itemToUpdate) { | 
|       itemToUpdate.name = newName; | 
|     } | 
|   } | 
|   | 
| const   deleteItem =  async (row)=>{ | 
|     console.log(row); | 
|     let data = await kbdocumentrm({doc_id: row.id}) | 
|     if(data.code == 0){ | 
|       Message.success('删除成功'); | 
|       console.log(kbobj, 'kbobj'); | 
|       fetchData({ | 
|         kb_id: kbobj.id, | 
|         page: 1, | 
|         page_size: 20 | 
|       }) | 
|     } | 
|   } | 
|   const   onDownloadDocument =  async (record)=>{ | 
|     console.log(record); | 
|     downloadFile({ | 
|       url: `/api/v1/document/get/${record.id}`, | 
|       filename: record.name, | 
|     }); | 
|   } | 
| const   seeload = async (row)=>{ | 
|   Object.assign(seeObj, row) | 
|   // console.log(seeObj.name, 'seeObj'); | 
|   let type = row.name.split('.')[1]; | 
|   console.log(type); | 
|   if(type=='pdf'){ | 
|     documenttype.value = 'txtPdf' | 
|   }else if(type=='docx'){ | 
|     documenttype.value = 'docx' | 
|   }else if(type=='xlsx'){ | 
|     documenttype.value = 'excel' | 
|   }else if(type=='txt'){ | 
|     documenttype.value = 'txtPdf' | 
|   }else { | 
|     return false | 
|   } | 
|   previewSrc.value = `${import.meta.env.VITE_API_BASE_URL}/v1/document/get/${row.id}` | 
|   visible.value = true; | 
|   | 
| } | 
|   | 
| const   handleChangeStatus =  async (row)=>{ | 
|   console.log(row); | 
|   let data = await kbdocumentchangeStatus({ | 
|     doc_id: row.id, | 
|     status: row.status | 
|   }) | 
|   if(data.code == 0){ | 
|     Message.success('操作成功'); | 
|   } | 
| } | 
|   | 
|   | 
| const   run =  async (row)=>{ | 
|   console.log(row); | 
|   row.loading = true; | 
|   let run = '1' | 
|   if(row.run!='2'){ | 
|     run = '1' | 
|   }else { | 
|     run = '2' | 
|   } | 
|   let data = await kbdocumentrun({ | 
|     doc_ids: [row.id], | 
|     run: run | 
|   }) | 
|   if(data.code == 0){ | 
|     Message.success('解析成功'); | 
|     row.run = '3'; | 
|   }else{ | 
|     Message.error('解析失败'); | 
|     row.run = '1'; | 
|   } | 
|   row.loading = false; | 
| } | 
|   | 
| const   changeFetchData =  async (row)=>{ | 
|   fetchData({ | 
|     kb_id: kbobj.id, | 
|     page: 1, | 
|     page_size: 20 | 
|   }) | 
| } | 
|   watch( | 
|     () => columns.value, | 
|     (val) => { | 
|       // alert(columns.value) | 
|       cloneColumns.value = cloneDeep(val); | 
|       cloneColumns.value.forEach((item, index) => { | 
|         item.checked = true; | 
|       }); | 
|       showColumns.value = cloneDeep(cloneColumns.value); | 
|     }, | 
|     { deep: true, immediate: true } | 
|   ); | 
|   | 
|   onBeforeMount(()=>{ | 
|   | 
|   }) | 
|   onMounted(()=>{ | 
|     knowledgeData() | 
|   }) | 
|   | 
| </script> | 
|   | 
| <script lang="ts"> | 
|   export default { | 
|     name: 'SearchTable', | 
|     methods: { | 
|   | 
|     } | 
|   }; | 
| </script> | 
|   | 
| <style scoped lang="less"> | 
|   .container { | 
|     padding: 0 20px 20px 20px; | 
|     .main-container{ | 
|       display: flex; | 
|       width: 100%; | 
|       height: 100%; | 
|       .lf-container{ | 
|         display: flex; | 
|         flex-direction: column; | 
|         align-items: center; | 
|         justify-content: space-evenly; | 
|         //background: #ffffff; | 
|         background: var(--color-bg-2); | 
|         width: 200px; | 
|         .lf-container-top{ | 
|           display: flex; | 
|           margin: 10px 0; | 
|         } | 
|         .lf-container-down{ | 
|           display: flex; | 
|           flex-direction: column; | 
|           box-sizing: border-box; | 
|           width: 90%; | 
|           //height: 56rem; | 
|           border: 1px solid var(--color-fill-3); | 
|           //padding: 10px; | 
|           margin-bottom: 10px; | 
|           //.tabs{ | 
|           //  width: 100%; | 
|           //  height: 100%; | 
|           //  overflow: auto; | 
|           //} | 
|           .tab { | 
|             cursor: pointer; | 
|             box-sizing: border-box; | 
|             margin: 10px 10px; | 
|             padding:0 10px; | 
|             color: rgba(0, 0, 0, 0.88); | 
|             font-size: 14px; | 
|             height: 40px; | 
|             line-height: 40px; | 
|             list-style: none; | 
|             position: relative; | 
|             background: #ffffff; | 
|             border: 1px solid #f0f0f0; | 
|             border-radius: 8px; | 
|           } | 
|           .tab:hover { | 
|             border: 1px solid #ffffff; | 
|             background: #e8e8ea; | 
|             box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); | 
|           } | 
|           .tab.active { | 
|             border: 1px solid #e8e8ea; | 
|             background: #e8e8ea; | 
|             cursor: pointer; | 
|           } | 
|         } | 
|       } | 
|       .rt-container{ | 
|         position: relative; | 
|         //background: #626aea; | 
|         margin-left: 20px; | 
|         width: calc(100% - 200px); | 
|         height: 56rem; | 
|         .rt-container-main{ | 
|           height: 76vh; | 
|         } | 
|         .details{ | 
|           position: absolute; | 
|           top: 0; | 
|           left: 0; | 
|           width: 100%; | 
|           height: 100%; | 
|           background: #ffffff; | 
|           .details-header{ | 
|             display: flex; | 
|             justify-content: space-between; | 
|             margin-top: 10px; | 
|             padding-right: 20px; | 
|           } | 
|         } | 
|       } | 
|     } | 
|   } | 
|   :deep(.arco-table-th) { | 
|     &:last-child { | 
|       .arco-table-th-item-title { | 
|         margin-left: 16px; | 
|       } | 
|     } | 
|   } | 
|   .action-icon { | 
|     margin-left: 12px; | 
|     cursor: pointer; | 
|   } | 
|   .active { | 
|     color: #0960bd; | 
|     background-color: #e3f4fc; | 
|   } | 
|   .setting { | 
|     display: flex; | 
|     align-items: center; | 
|     width: 200px; | 
|     .title { | 
|       margin-left: 12px; | 
|       cursor: pointer; | 
|     } | 
|   } | 
| </style> |