|  |  | 
 |  |  |         <div class="lf-container-top"> | 
 |  |  |           <a-input-search | 
 |  |  |             :placeholder="$t('cardList.searchInput.placeholder')" | 
 |  |  |             style="width: 130px;" | 
 |  |  |             style="width: 130px" | 
 |  |  |           /> | 
 |  |  |           <addKnow @getknowledge="getknowledge" @getKbdetail="getKbdetail"></addKnow> | 
 |  |  |           <addKnow | 
 |  |  |             @getknowledge="getknowledge" | 
 |  |  |             @getKbdetail="getKbdetail" | 
 |  |  |           ></addKnow> | 
 |  |  |         </div> | 
 |  |  |         <a-spin :loading="listloading" class="lf-container-down"> | 
 |  |  |           <a-scrollbar style="height: calc(100vh - 300px); overflow: auto"> | 
 |  |  | 
 |  |  |               class="tab" | 
 |  |  |               v-for="(tab, index) in tabs" | 
 |  |  |               :key="index" | 
 |  |  |               @click="selectTab(index,tab)" | 
 |  |  |               :class="{ 'active': selectedTab === index }" | 
 |  |  |               @click="selectTab(index, tab)" | 
 |  |  |               :class="{ active: selectedTab === index }" | 
 |  |  |             > | 
 |  |  |               {{ tab.name }} | 
 |  |  |               <a-popover position="bl"> | 
 |  |  |                 <icon-more :style="{position: 'absolute',top:'10px',right:'10px'}" /> | 
 |  |  |                 <icon-more | 
 |  |  |                   :style="{ position: 'absolute', top: '10px', right: '10px' }" | 
 |  |  |                 /> | 
 |  |  |                 <template #content> | 
 |  |  |                   <!--                  <a-popconfirm content="确定删除吗?" @ok="deleteKnowledge(tab.id)" type="warning">--> | 
 |  |  |                   <!--                    <span style="cursor: pointer;color: #4977ba;font-size: 12px"><icon-delete style="font-size: 14px"/>删除</span>--> | 
 |  |  |                   <!--                  </a-popconfirm>--> | 
 |  |  |                   <span style="cursor: pointer;color: #4977ba;font-size: 12px" @click="deleteKnowledge(tab.id)"><icon-delete | 
 |  |  |                     style="font-size: 14px" />删除</span> | 
 |  |  |                   <span | 
 |  |  |                     style="cursor: pointer; color: #4977ba; font-size: 12px" | 
 |  |  |                     @click="deleteKnowledge(tab.id)" | 
 |  |  |                     ><icon-delete style="font-size: 14px" />删除</span | 
 |  |  |                   > | 
 |  |  |                 </template> | 
 |  |  |               </a-popover> | 
 |  |  |             </div> | 
 |  |  | 
 |  |  |       <div class="rt-container" v-if="tabs.length > 0"> | 
 |  |  |         <a-tabs :active-key="activeKey" @change="handleTabChange"> | 
 |  |  |           <a-tab-pane key="1" :title="t('dmx.list.DataSet')"> | 
 |  |  |             <a-scrollbar class="rt-container-main" :style="{height: documentHeight + 70 + 'px'}" style="overflow: auto"> | 
 |  |  |               <a-card ref="account" class="general-card" title="" style="padding-top: 20px"> | 
 |  |  |             <a-scrollbar | 
 |  |  |               class="rt-container-main" | 
 |  |  |               :style="{ height: documentHeight + 70 + 'px' }" | 
 |  |  |               style="overflow: auto" | 
 |  |  |             > | 
 |  |  |               <a-card | 
 |  |  |                 ref="account" | 
 |  |  |                 class="general-card" | 
 |  |  |                 title="" | 
 |  |  |                 style="padding-top: 20px" | 
 |  |  |               > | 
 |  |  |                 <a-row> | 
 |  |  |                   <a-col :flex="1" :span="12"> | 
 |  |  |                     <a-form | 
 |  |  | 
 |  |  |                       label-align="left" | 
 |  |  |                     > | 
 |  |  |                       <a-row :gutter="16"> | 
 |  |  |                         <a-col :span="24" style="margin-bottom: 10px;display: flex;justify-content: space-between"> | 
 |  |  |                         <a-col | 
 |  |  |                           :span="24" | 
 |  |  |                           style=" | 
 |  |  |                             margin-bottom: 10px; | 
 |  |  |                             display: flex; | 
 |  |  |                             justify-content: space-between; | 
 |  |  |                           " | 
 |  |  |                         > | 
 |  |  |                           <a-popover | 
 |  |  |                             position="bottom" | 
 |  |  |                             v-model="checkedArr.length" | 
 |  |  |                             trigger="click" | 
 |  |  |                           > | 
 |  |  |                             <a-button | 
 |  |  |                               :disabled="checkedArr.length == 0" | 
 |  |  |                               border | 
 |  |  |                             >批量 | 
 |  |  |                             <a-button :disabled="checkedArr.length == 0" border | 
 |  |  |                               >批量 | 
 |  |  |                               <icon-down style="margin-left: 4px" /> | 
 |  |  |                             </a-button> | 
 |  |  |                             <template #content> | 
 |  |  | 
 |  |  |                             </template> | 
 |  |  |                           </a-popover> | 
 |  |  |                           <span> | 
 |  |  |                                                       <a-input-search | 
 |  |  |                                                         :placeholder="$t('cardList.searchInput.placeholder')" | 
 |  |  |                                                         style="width: 200px;margin-right: 10px" | 
 |  |  |                                                         v-model="keywords" | 
 |  |  |                                                         @change="search" | 
 |  |  |                                                       /> | 
 |  |  |                             <a-input-search | 
 |  |  |                               :placeholder=" | 
 |  |  |                                 $t('cardList.searchInput.placeholder') | 
 |  |  |                               " | 
 |  |  |                               style="width: 200px; margin-right: 10px" | 
 |  |  |                               v-model="keywords" | 
 |  |  |                               @change="search" | 
 |  |  |                             /> | 
 |  |  |                             <!--新建--> | 
 |  |  |                               <add :kbobj="kbobj" @changeFetchData="changeFetchData" /> | 
 |  |  |                             <add | 
 |  |  |                               :kbobj="kbobj" | 
 |  |  |                               @changeFetchData="changeFetchData" | 
 |  |  |                             /> | 
 |  |  |                           </span> | 
 |  |  |                         </a-col> | 
 |  |  |                       </a-row> | 
 |  |  | 
 |  |  |                   </a-col> | 
 |  |  |                   <a-col | 
 |  |  |                     :span="12" | 
 |  |  |                     style="display: flex; align-items: center; justify-content: end" | 
 |  |  |                     style=" | 
 |  |  |                       display: flex; | 
 |  |  |                       align-items: center; | 
 |  |  |                       justify-content: end; | 
 |  |  |                     " | 
 |  |  |                   > | 
 |  |  |                     <!--          <a-button>--> | 
 |  |  |                     <!--            <template #icon>--> | 
 |  |  | 
 |  |  |                     <!--            {{ $t('searchTable.operation.download') }}--> | 
 |  |  |                     <!--          </a-button>--> | 
 |  |  |                     <a-tooltip :content="$t('searchTable.actions.refresh')"> | 
 |  |  |                       <div class="action-icon" | 
 |  |  |                       > | 
 |  |  |                         <icon-refresh size="18" | 
 |  |  |                         /> | 
 |  |  |                       <div class="action-icon"> | 
 |  |  |                         <icon-refresh size="18" /> | 
 |  |  |                       </div> | 
 |  |  |                     </a-tooltip> | 
 |  |  |                     <a-dropdown @select="handleSelectDensity"> | 
 |  |  | 
 |  |  |                   :bordered="false" | 
 |  |  |                   :size="size" | 
 |  |  |                   @page-change="onPageChange" | 
 |  |  |                   :max-height='documentHeight' | 
 |  |  |                   :scroll="{x: 1000}" | 
 |  |  |                   :max-height="documentHeight" | 
 |  |  |                   :scroll="{ x: 1000 }" | 
 |  |  |                   :row-selection="{ | 
 |  |  |                     type: 'checkbox', | 
 |  |  |                     showCheckedAll: true, | 
 |  |  | 
 |  |  |                 > | 
 |  |  |                   <template #name="{ record }"> | 
 |  |  |                     <!--                    <icon-file style="color: #0960bd;margin-right: 4px;" />--> | 
 |  |  |                     <icon-file style="margin-right: 4px;" /> | 
 |  |  |                     <icon-file style="margin-right: 4px" /> | 
 |  |  |                     <!--                    <span style="color: #0960bd;cursor: pointer" @click="fileClick">--> | 
 |  |  |                     <!--                      {{record.name}}--> | 
 |  |  |                     <!--                    </span>--> | 
 |  |  | 
 |  |  |                   <!--                    <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)" /> | 
 |  |  |                     <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="display: flex; align-items: center"> | 
 |  |  |                       <div style="width: 100px"> | 
 |  |  |                         <a-popover title="" v-if="record.run == '4'"> | 
 |  |  |                           <a-tag :loading="record.loading" :color="'blue'" border>{{ $t("dmx.list.complete") }}</a-tag> | 
 |  |  |                           <a-tag | 
 |  |  |                             :loading="record.loading" | 
 |  |  |                             :color="'blue'" | 
 |  |  |                             border | 
 |  |  |                             >{{ $t('dmx.list.complete') }}</a-tag | 
 |  |  |                           > | 
 |  |  |                           <template #content> | 
 |  |  |                             <p></p> | 
 |  |  |                           </template> | 
 |  |  |                         </a-popover> | 
 |  |  |                         <a-popover title="" v-if="record.run == '3'"> | 
 |  |  |                           <a-tag :loading="record.loading" :color="'blue'" border>{{ $t("dmx.list.complete") }}</a-tag> | 
 |  |  |                           <a-tag | 
 |  |  |                             :loading="record.loading" | 
 |  |  |                             :color="'blue'" | 
 |  |  |                             border | 
 |  |  |                             >{{ $t('dmx.list.complete') }}</a-tag | 
 |  |  |                           > | 
 |  |  |                           <template #content> | 
 |  |  |                             <p></p> | 
 |  |  |                           </template> | 
 |  |  |                         </a-popover> | 
 |  |  |                         <a-popover title="" v-if="record.run == '1'"> | 
 |  |  |                           <a-tag :loading="record.loading" :color="'blue'" border>解析中...</a-tag> | 
 |  |  |                           <a-tag | 
 |  |  |                             :loading="record.loading" | 
 |  |  |                             :color="'blue'" | 
 |  |  |                             border | 
 |  |  |                             >解析中...</a-tag | 
 |  |  |                           > | 
 |  |  |                           <template #content> | 
 |  |  |                             <p></p> | 
 |  |  |                           </template> | 
 |  |  |                         </a-popover> | 
 |  |  |                         <a-popover title="" v-if="record.run == '2'"> | 
 |  |  |                           <a-tag :loading="record.loading" :color="'gold'" border>{{ $t("dmx.list.cancel") }}</a-tag> | 
 |  |  |                           <a-tag | 
 |  |  |                             :loading="record.loading" | 
 |  |  |                             :color="'gold'" | 
 |  |  |                             border | 
 |  |  |                             >{{ $t('dmx.list.cancel') }}</a-tag | 
 |  |  |                           > | 
 |  |  |                           <template #content> | 
 |  |  |                             <p></p> | 
 |  |  |                           </template> | 
 |  |  |                         </a-popover> | 
 |  |  |                         <a-popover title="" v-if="record.run == '0'"> | 
 |  |  |                           <a-tag :loading="record.loading" :color="'green'" border>{{ $t("dmx.list.NotStarted") }} | 
 |  |  |                           <a-tag | 
 |  |  |                             :loading="record.loading" | 
 |  |  |                             :color="'green'" | 
 |  |  |                             border | 
 |  |  |                             >{{ $t('dmx.list.NotStarted') }} | 
 |  |  |                           </a-tag> | 
 |  |  |                           <template #content> | 
 |  |  |                             <p></p> | 
 |  |  | 
 |  |  |                         </a-popover> | 
 |  |  |                       </div> | 
 |  |  |                       <div> | 
 |  |  |                         <a-button type="text" size="large" @click="run(record)" :loading="record.loading"> | 
 |  |  |                         <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 style="color: green" v-if="record.run == '2'" /> | 
 |  |  |                             <a-button status="warning" shape="circle" v-if="record.run == '1'" size="small"> | 
 |  |  |                             <icon-sync | 
 |  |  |                               style="color: green" | 
 |  |  |                               v-if="record.run == '2'" | 
 |  |  |                             /> | 
 |  |  |                             <a-button | 
 |  |  |                               status="warning" | 
 |  |  |                               shape="circle" | 
 |  |  |                               v-if="record.run == '1'" | 
 |  |  |                               size="small" | 
 |  |  |                             > | 
 |  |  |                               <icon-close /> | 
 |  |  |                             </a-button> | 
 |  |  |                             <icon-play-circle style="color: green" v-if="record.run == '0'" /> | 
 |  |  |                             <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" /> | 
 |  |  |                     <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" :disabled="record.run == '1'"> | 
 |  |  |                     <a-popconfirm | 
 |  |  |                       :content="'确定删除吗'" | 
 |  |  |                       type="warning" | 
 |  |  |                       @ok="deleteItem(record)" | 
 |  |  |                     > | 
 |  |  |                       <a-button | 
 |  |  |                         type="text" | 
 |  |  |                         size="small" | 
 |  |  |                         :disabled="record.run == '1'" | 
 |  |  |                       > | 
 |  |  |                         <template #icon> | 
 |  |  |                           <icon-delete /> | 
 |  |  |                         </template> | 
 |  |  |                       </a-button> | 
 |  |  |                     </a-popconfirm> | 
 |  |  |                     <a-button type="text" size="small" :disabled="record.run == '1'" | 
 |  |  |                               @click="onDownloadDocument(record)"> | 
 |  |  |                     <a-button | 
 |  |  |                       type="text" | 
 |  |  |                       size="small" | 
 |  |  |                       :disabled="record.run == '1'" | 
 |  |  |                       @click="onDownloadDocument(record)" | 
 |  |  |                     > | 
 |  |  |                       <template #icon> | 
 |  |  |                         <icon-download /> | 
 |  |  |                       </template> | 
 |  |  |                     </a-button> | 
 |  |  |  | 
 |  |  |                     <a-button type="text" size="small" :disabled="record.run == '1'" @click="previewArea(record)"> | 
 |  |  |                     <a-button | 
 |  |  |                       type="text" | 
 |  |  |                       size="small" | 
 |  |  |                       :disabled="record.run == '1'" | 
 |  |  |                       @click="previewArea(record)" | 
 |  |  |                     > | 
 |  |  |                       <template #icon> | 
 |  |  |                         <icon-eye /> | 
 |  |  |                       </template> | 
 |  |  |                     </a-button> | 
 |  |  |  | 
 |  |  |                   </template> | 
 |  |  |                 </a-table> | 
 |  |  |               </a-card> | 
 |  |  |             </a-scrollbar> | 
 |  |  |           </a-tab-pane> | 
 |  |  |           <a-tab-pane key="2" :title="t('dmx.list.test')"> | 
 |  |  |             <a-scrollbar class="rt-container-main" :style="{height: documentHeight + 70 + 'px'}" style="overflow: auto"> | 
 |  |  |             <a-scrollbar | 
 |  |  |               class="rt-container-main" | 
 |  |  |               :style="{ height: documentHeight + 70 + 'px' }" | 
 |  |  |               style="overflow: auto" | 
 |  |  |             > | 
 |  |  |               <test ref="testForm"></test> | 
 |  |  |             </a-scrollbar> | 
 |  |  |           </a-tab-pane> | 
 |  |  |           <a-tab-pane key="3" :title="t('dmx.list.disposition')"> | 
 |  |  |             <a-scrollbar class="rt-container-main" :style="{height: documentHeight + 70 + 'px'}" style="overflow: auto"> | 
 |  |  |               <config ref="configForm" :kbtenantInfo="kbtenantInfo" @cancleConfig="cancleConfig" | 
 |  |  |                       @saveConfig="saveConfig"></config> | 
 |  |  |             <a-scrollbar | 
 |  |  |               class="rt-container-main" | 
 |  |  |               :style="{ height: documentHeight + 70 + 'px' }" | 
 |  |  |               style="overflow: auto" | 
 |  |  |             > | 
 |  |  |               <config | 
 |  |  |                 ref="configForm" | 
 |  |  |                 :kbtenantInfo="kbtenantInfo" | 
 |  |  |                 @cancleConfig="cancleConfig" | 
 |  |  |                 @saveConfig="saveConfig" | 
 |  |  |               ></config> | 
 |  |  |             </a-scrollbar> | 
 |  |  |           </a-tab-pane> | 
 |  |  |         </a-tabs> | 
 |  |  | 
 |  |  |     </div> | 
 |  |  |     <a-modal title=" " v-model:visible="visible" :footer="false" fullscreen> | 
 |  |  |       <!--      <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> | 
 |  |  |       <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, | 
 |  |  |   chunkSwitch | 
 |  |  | } 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, Modal } from "@arco-design/web-vue"; | 
 |  |  | import { documentHeight, parseTime } from "@/utils"; | 
 |  |  | import { deleteLlm } from "@/api/model"; | 
 |  |  | import { userModelState } from "@/store"; | 
 |  |  |   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, | 
 |  |  |     chunkSwitch, | 
 |  |  |   } 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, Modal } from '@arco-design/web-vue'; | 
 |  |  |   import { documentHeight, parseTime } from '@/utils'; | 
 |  |  |   import { deleteLlm } from '@/api/model'; | 
 |  |  |   import { userModelState } from '@/store'; | 
 |  |  |  | 
 |  |  | let modelStore = userModelState(); | 
 |  |  | const httpUrl = modelStore.hrefUrl; | 
 |  |  | type SizeProps = "mini" | "small" | "medium" | "large"; | 
 |  |  | type Column = TableColumnData & { checked?: true }; | 
 |  |  | const account = ref(null); | 
 |  |  | const generateFormModel = () => { | 
 |  |  |   return { | 
 |  |  |     number: "", | 
 |  |  |     name: "", | 
 |  |  |     contentType: "", | 
 |  |  |     filterType: "", | 
 |  |  |     createdTime: [], | 
 |  |  |     status: "" | 
 |  |  |   let modelStore = userModelState(); | 
 |  |  |   const httpUrl = modelStore.hrefUrl; | 
 |  |  |   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 { 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 listloading = ref(false); | 
 |  |  | let keywords = ref(""); | 
 |  |  | let activeKey = ref("1"); | 
 |  |  | let detailsShow = ref(false); | 
 |  |  | let checkedAll = ref(false); | 
 |  |  | let checkedArr = ref([]); | 
 |  |  | 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; | 
 |  |  |   fetchData({ | 
 |  |  |     kb_id: kbobj.id, | 
 |  |  |     page: 1, | 
 |  |  |     page_size: 20 | 
 |  |  |   const size = ref<SizeProps>('medium'); | 
 |  |  |   let visible = ref(false); | 
 |  |  |   let listloading = ref(false); | 
 |  |  |   let keywords = ref(''); | 
 |  |  |   let activeKey = ref('1'); | 
 |  |  |   let detailsShow = ref(false); | 
 |  |  |   let checkedAll = ref(false); | 
 |  |  |   let checkedArr = ref([]); | 
 |  |  |   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: {}, | 
 |  |  |   }); | 
 |  |  |   getKbdetail(kbobj.id); | 
 |  |  | }; | 
 |  |  |   let tabs = ref([]); | 
 |  |  |  | 
 |  |  | 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); | 
 |  |  |     if (data.code == "0") { | 
 |  |  |       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'); | 
 |  |  |   const selectTab = (index, item) => { | 
 |  |  |     selectedTab.value = index; | 
 |  |  |     // console.log(item.id); | 
 |  |  |     kbobj = item; | 
 |  |  |     kbId = kbobj.id; | 
 |  |  |     fetchData({ | 
 |  |  |       kb_id: kbobj.id, | 
 |  |  |       page: 1, | 
 |  |  |       page_size: 20, | 
 |  |  |     }); | 
 |  |  |     getKbdetail(kbobj.id); | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |       pagination.current = params.page; | 
 |  |  |       pagination.total = data.data.total; | 
 |  |  |   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); | 
 |  |  |       if (data.code == '0') { | 
 |  |  |         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; | 
 |  |  |       } | 
 |  |  |     } catch (err) { | 
 |  |  |       // you can report use errorHandler or other | 
 |  |  |     } finally { | 
 |  |  |       setLoading(false); | 
 |  |  |     } | 
 |  |  |   } 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 selectTabAll = (val) => { | 
 |  |  |     console.log(val, '全选'); | 
 |  |  |     checkedAll.value = val; | 
 |  |  |   }; | 
 |  |  |   const selectTabChange = (val) => { | 
 |  |  |     console.log(val, '单选'); | 
 |  |  |     checkedArr.value = val; | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |   const knowledgeData = async (params = { page: 1, page_size: 20 }) => { | 
 |  |  |     listloading.value = 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; | 
 |  |  |         activeKey.value = '1'; | 
 |  |  |         fetchData({ | 
 |  |  |           kb_id: kbobj.id, | 
 |  |  |           page: 1, | 
 |  |  |           page_size: 20, | 
 |  |  |         }); | 
 |  |  |         getKbdetail(kbobj.id); | 
 |  |  |       } else { | 
 |  |  |       } | 
 |  |  |       // 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 { | 
 |  |  |       listloading.value = false; | 
 |  |  |     } | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |   const getKbdetail = async (kb_id) => { | 
 |  |  |     //   查询知识库详情 | 
 |  |  |     const data = await queryKbdetail({ | 
 |  |  |       kb_id: kb_id, | 
 |  |  |     }); | 
 |  |  |     kbdetail = data.data; | 
 |  |  |     testForm.value.changekbid(kbdetail.id); | 
 |  |  |     configForm.value.changekbObj(kbdetail); | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |   const getknowledge = async (id) => { | 
 |  |  |     setLoading(true); | 
 |  |  |     try { | 
 |  |  |       const { data } = await queryKbList({ page: 1, page_size: 20 }); | 
 |  |  |       console.log(data, '查询知识库列表'); | 
 |  |  |       tabs.value = data; | 
 |  |  |       if (tabs.value.length > 0) { | 
 |  |  |         // 定位到新增的知识库单元 | 
 |  |  |         selectedTab.value = tabs.value.findIndex((item) => item.id == id); | 
 |  |  |         getKbdetail(id); // 获取详情 | 
 |  |  |         activeKey.value = '3'; | 
 |  |  |       } | 
 |  |  |     } catch (err) { | 
 |  |  |       // you can report use errorHandler or other | 
 |  |  |     } finally { | 
 |  |  |       setLoading(false); | 
 |  |  |     } | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |   const deleteKnowledge = (id) => { | 
 |  |  |     Modal.confirm({ | 
 |  |  |       title: '提示信息', | 
 |  |  |       content: '确认删除吗', | 
 |  |  |       okText: '确定', | 
 |  |  |       cancelText: '取消', | 
 |  |  |       hideTitle: true, | 
 |  |  |       onOk: async () => { | 
 |  |  |         let data = await deleteKnow({ | 
 |  |  |           kb_id: id, | 
 |  |  |         }); | 
 |  |  |         if (data.code == 0) { | 
 |  |  |           Message.success('删除成功'); | 
 |  |  |           knowledgeData(); | 
 |  |  |         } | 
 |  |  |       }, | 
 |  |  |       onCancel: () => {}, | 
 |  |  |     }); | 
 |  |  |   }; | 
 |  |  |   const reset = () => { | 
 |  |  |     formModel.value = generateFormModel(); | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |   function handleTabChange(key) { | 
 |  |  |     // 处理标签改变事件 | 
 |  |  |     console.log('Changed to tab:', key); | 
 |  |  |     activeKey.value = key; | 
 |  |  |   } | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | const search = () => { | 
 |  |  |   fetchData({ | 
 |  |  |     kb_id: kbobj.id, | 
 |  |  |     page: 1, | 
 |  |  |     page_size: 20, | 
 |  |  |     keywords: keywords.value | 
 |  |  |   }); | 
 |  |  | }; | 
 |  |  |   const handleSelectDensity = ( | 
 |  |  |     val: string | number | Record<string, any> | undefined, | 
 |  |  |     e: Event | 
 |  |  |   ) => { | 
 |  |  |     size.value = val as SizeProps; | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  | const handleClick = () => { | 
 |  |  |   visible.value = true; | 
 |  |  | }; | 
 |  |  |   const cancleConfig = () => { | 
 |  |  |     activeKey.value = '1'; | 
 |  |  |     let id = tabs.value[selectedTab.value].id; | 
 |  |  |     fetchData({ | 
 |  |  |       kb_id: id, | 
 |  |  |       page: 1, | 
 |  |  |       page_size: 20, | 
 |  |  |     }); | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  | const onPageChange = (current: number) => { | 
 |  |  |   fetchData({ ...basePagination, current }); | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | const selectTabAll = (val) => { | 
 |  |  |   console.log(val,'全选'); | 
 |  |  |   checkedAll.value = val; | 
 |  |  | }; | 
 |  |  | const selectTabChange = (val) => { | 
 |  |  |   console.log(val,'单选'); | 
 |  |  |   checkedArr.value = val; | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | const knowledgeData = async ( | 
 |  |  |   params = { page: 1, page_size: 20 } | 
 |  |  | ) => { | 
 |  |  |   listloading.value = true; | 
 |  |  |   try { | 
 |  |  |     const { data } = await queryKbList(params); | 
 |  |  |     // console.log(data, 'data'); | 
 |  |  |   const saveConfig = async () => { | 
 |  |  |     activeKey.value = '1'; | 
 |  |  |     let id = tabs.value[selectedTab.value].id; | 
 |  |  |     const { data } = await queryKbList({ page: 1, page_size: 20 }); | 
 |  |  |     tabs.value = data; | 
 |  |  |     // console.log(tabs.value, 'tabs'); | 
 |  |  |     if (tabs.value.length > 0 && tabs.value[0]) { | 
 |  |  |       kbobj = tabs.value[0]; | 
 |  |  |       kbId = kbobj.id; | 
 |  |  |       activeKey.value = "1"; | 
 |  |  |     fetchData({ | 
 |  |  |       kb_id: id, | 
 |  |  |       page: 1, | 
 |  |  |       page_size: 20, | 
 |  |  |     }); | 
 |  |  |     getKbdetail(id); // 获取详情 | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |   //批量启用删除禁用 | 
 |  |  |   const addBlock = async (type) => { | 
 |  |  |     if (type != 3) { | 
 |  |  |       //启动和取消 | 
 |  |  |       let data = await kbdocumentrun({ | 
 |  |  |         doc_ids: checkedArr.value, | 
 |  |  |         run: type, | 
 |  |  |       }); | 
 |  |  |       if (data.code == 0) { | 
 |  |  |         checkedArr.value.forEach(async (item) => { | 
 |  |  |           tabs.value.forEach(async (items) => { | 
 |  |  |             if (items.id == item) { | 
 |  |  |               items.loading = true; | 
 |  |  |             } | 
 |  |  |           }); | 
 |  |  |         }); | 
 |  |  |         fetchData({ | 
 |  |  |           kb_id: tabs.value[selectedTab.value].id, | 
 |  |  |           page: 1, | 
 |  |  |           page_size: 20, | 
 |  |  |         }); | 
 |  |  |       } else { | 
 |  |  |         // Message.error('解析失败'); | 
 |  |  |         // row.run = '1'; | 
 |  |  |       } | 
 |  |  |     } else { | 
 |  |  |       //批量删除 | 
 |  |  |       Modal.confirm({ | 
 |  |  |         title: '提示信息', | 
 |  |  |         content: '确认删除吗', | 
 |  |  |         okText: '确定', | 
 |  |  |         cancelText: '取消', | 
 |  |  |         hideTitle: true, | 
 |  |  |         onOk: async () => { | 
 |  |  |           let data = await kbdocumentrm({ doc_id: checkedArr.value }); | 
 |  |  |           if (data.code == 0) { | 
 |  |  |             Message.success('删除成功'); | 
 |  |  |             fetchData({ | 
 |  |  |               kb_id: tabs.value[selectedTab.value].id, | 
 |  |  |               page: 1, | 
 |  |  |               page_size: 20, | 
 |  |  |             }); | 
 |  |  |           } | 
 |  |  |         }, | 
 |  |  |         onCancel: () => {}, | 
 |  |  |       }); | 
 |  |  |     } | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |   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 | 
 |  |  |         page_size: 20, | 
 |  |  |       }); | 
 |  |  |       getKbdetail(kbobj.id); | 
 |  |  |     } | 
 |  |  |   }; | 
 |  |  |   const onDownloadDocument = async (record) => { | 
 |  |  |     console.log(record); | 
 |  |  |     downloadFile({ | 
 |  |  |       url: `/api/v1/document/get/${record.id}`, | 
 |  |  |       filename: record.name, | 
 |  |  |     }); | 
 |  |  |   }; | 
 |  |  |   const previewArea = 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 { | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |     // 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 { | 
 |  |  |     listloading.value = false; | 
 |  |  |   } | 
 |  |  | }; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | const getKbdetail = async (kb_id) => { | 
 |  |  |   //   查询知识库详情 | 
 |  |  |   const data = await queryKbdetail({ | 
 |  |  |     kb_id: kb_id | 
 |  |  |   }); | 
 |  |  |   kbdetail = data.data; | 
 |  |  |   testForm.value.changekbid(kbdetail.id); | 
 |  |  |   configForm.value.changekbObj(kbdetail); | 
 |  |  | }; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | const getknowledge = async (id) => { | 
 |  |  |   setLoading(true); | 
 |  |  |   try { | 
 |  |  |     const { data } = await queryKbList({ page: 1, page_size: 20 }); | 
 |  |  |     console.log(data, "查询知识库列表"); | 
 |  |  |     tabs.value = data; | 
 |  |  |     if (tabs.value.length > 0) { | 
 |  |  |       // 定位到新增的知识库单元 | 
 |  |  |       selectedTab.value = tabs.value.findIndex(item => item.id == id); | 
 |  |  |       getKbdetail(id); // 获取详情 | 
 |  |  |       activeKey.value = "3"; | 
 |  |  |       return false; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     previewSrc.value = `${import.meta.env.VITE_API_BASE_URL}/v1/document/get/${ | 
 |  |  |       row.id | 
 |  |  |     }`; | 
 |  |  |     // previewSrc.value = `${ httpUrl }/v1/document/get/${row.id}` | 
 |  |  |     visible.value = true; | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |   } catch (err) { | 
 |  |  |     // you can report use errorHandler or other | 
 |  |  |   } finally { | 
 |  |  |     setLoading(false); | 
 |  |  |   } | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | const deleteKnowledge = (id) => { | 
 |  |  |   Modal.confirm({ | 
 |  |  |     title: "提示信息", | 
 |  |  |     content: "确认删除吗", | 
 |  |  |     okText: "确定", | 
 |  |  |     cancelText: "取消", | 
 |  |  |     hideTitle: true, | 
 |  |  |     onOk: async () => { | 
 |  |  |       let data = await deleteKnow({ | 
 |  |  |         kb_id: id | 
 |  |  |       }); | 
 |  |  |       if (data.code == 0) { | 
 |  |  |         Message.success("删除成功"); | 
 |  |  |         knowledgeData(); | 
 |  |  |       } | 
 |  |  |     }, | 
 |  |  |     onCancel: () => { | 
 |  |  |     } | 
 |  |  |   }); | 
 |  |  | }; | 
 |  |  | const reset = () => { | 
 |  |  |   formModel.value = generateFormModel(); | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | function handleTabChange(key) { | 
 |  |  |   // 处理标签改变事件 | 
 |  |  |   console.log("Changed to tab:", key); | 
 |  |  |   activeKey.value = key; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | const handleSelectDensity = ( | 
 |  |  |   val: string | number | Record<string, any> | undefined, | 
 |  |  |   e: Event | 
 |  |  | ) => { | 
 |  |  |   size.value = val as SizeProps; | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | const cancleConfig = () => { | 
 |  |  |   activeKey.value = "1"; | 
 |  |  |   let id = tabs.value[selectedTab.value].id; | 
 |  |  |   fetchData({ | 
 |  |  |     kb_id: id, | 
 |  |  |     page: 1, | 
 |  |  |     page_size: 20 | 
 |  |  |   }); | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | const saveConfig = async () => { | 
 |  |  |   activeKey.value = "1"; | 
 |  |  |   let id = tabs.value[selectedTab.value].id; | 
 |  |  |   const { data } = await queryKbList({ page: 1, page_size: 20 }); | 
 |  |  |   tabs.value = data; | 
 |  |  |   fetchData({ | 
 |  |  |     kb_id: id, | 
 |  |  |     page: 1, | 
 |  |  |     page_size: 20 | 
 |  |  |   }); | 
 |  |  |   getKbdetail(id); // 获取详情 | 
 |  |  | }; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | //批量启用删除禁用 | 
 |  |  | const addBlock = async (type) => { | 
 |  |  |   if (type != 3) { | 
 |  |  |     //启动和取消 | 
 |  |  |     let data = await kbdocumentrun({ | 
 |  |  |       doc_ids: checkedArr.value, | 
 |  |  |       run: type | 
 |  |  |   const handleChangeStatus = async (row) => { | 
 |  |  |     console.log(row); | 
 |  |  |     let data = await kbdocumentchangeStatus({ | 
 |  |  |       doc_id: row.id, | 
 |  |  |       status: row.status, | 
 |  |  |     }); | 
 |  |  |     if (data.code == 0) { | 
 |  |  |       checkedArr.value.forEach(async (item) => { | 
 |  |  |         tabs.value.forEach(async (items) => { | 
 |  |  |           if(items.id == item){ | 
 |  |  |             items.loading = true; | 
 |  |  |           } | 
 |  |  |         }) | 
 |  |  |       }) | 
 |  |  |       Message.success('操作成功'); | 
 |  |  |     } | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |   const run = async (row) => { | 
 |  |  |     row.loading = true; | 
 |  |  |     let run; | 
 |  |  |     if (row.run == '0') { | 
 |  |  |       run = '1'; | 
 |  |  |     } else if (row.run == '1') { | 
 |  |  |       run = '2'; | 
 |  |  |     } else if (row.run == '2') { | 
 |  |  |       run = '1'; | 
 |  |  |     } else { | 
 |  |  |       run = '1'; | 
 |  |  |     } | 
 |  |  |     let data = await kbdocumentrun({ | 
 |  |  |       doc_ids: [row.id], | 
 |  |  |       run: run, | 
 |  |  |     }); | 
 |  |  |     if (data.code == 0) { | 
 |  |  |       fetchData({ | 
 |  |  |         kb_id: tabs.value[selectedTab.value].id, | 
 |  |  |         page: 1, | 
 |  |  |         page_size: 20 | 
 |  |  |         page_size: 20, | 
 |  |  |       }); | 
 |  |  |     } else { | 
 |  |  |       // Message.error('解析失败'); | 
 |  |  |       // row.run = '1'; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     row.loading = false; | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |   } else { | 
 |  |  |   //批量删除 | 
 |  |  |     Modal.confirm({ | 
 |  |  |       title: "提示信息", | 
 |  |  |       content: "确认删除吗", | 
 |  |  |       okText: "确定", | 
 |  |  |       cancelText: "取消", | 
 |  |  |       hideTitle: true, | 
 |  |  |       onOk: async () => { | 
 |  |  |         let data = await kbdocumentrm({ doc_id: checkedArr.value }); | 
 |  |  |         if (data.code == 0) { | 
 |  |  |           Message.success("删除成功"); | 
 |  |  |           fetchData({ | 
 |  |  |             kb_id: tabs.value[selectedTab.value].id, | 
 |  |  |             page: 1, | 
 |  |  |             page_size: 20 | 
 |  |  |           }); | 
 |  |  |         } | 
 |  |  |       }, | 
 |  |  |       onCancel: () => { | 
 |  |  |       } | 
 |  |  |     }); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |   } | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | 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'); | 
 |  |  |   const changeFetchData = async (row) => { | 
 |  |  |     fetchData({ | 
 |  |  |       kb_id: kbobj.id, | 
 |  |  |       page: 1, | 
 |  |  |       page_size: 20 | 
 |  |  |       page_size: 20, | 
 |  |  |     }); | 
 |  |  |   } | 
 |  |  | }; | 
 |  |  | const onDownloadDocument = async (record) => { | 
 |  |  |   console.log(record); | 
 |  |  |   downloadFile({ | 
 |  |  |     url: `/api/v1/document/get/${record.id}`, | 
 |  |  |     filename: record.name | 
 |  |  |   }; | 
 |  |  |   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(async () => { | 
 |  |  |     // const  {data}  = await queryKbtenantInfo(); | 
 |  |  |     // Object.assign(kbtenantInfo,data); | 
 |  |  |     // console.log(kbtenantInfo,'kbtenantInfo的数据'); | 
 |  |  |   }); | 
 |  |  | }; | 
 |  |  | const previewArea = 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}`; | 
 |  |  |   // previewSrc.value = `${ httpUrl }/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 | 
 |  |  |   onMounted(() => { | 
 |  |  |     knowledgeData(); | 
 |  |  |   }); | 
 |  |  |   if (data.code == 0) { | 
 |  |  |     Message.success("操作成功"); | 
 |  |  |   } | 
 |  |  | }; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | const run = async (row) => { | 
 |  |  |   row.loading = true; | 
 |  |  |   let run; | 
 |  |  |   if (row.run == "0") { | 
 |  |  |     run = "1"; | 
 |  |  |   } else if (row.run == "1") { | 
 |  |  |     run = "2"; | 
 |  |  |   } else if (row.run == "2") { | 
 |  |  |     run = "1"; | 
 |  |  |   } else { | 
 |  |  |     run = "1"; | 
 |  |  |   } | 
 |  |  |   let data = await kbdocumentrun({ | 
 |  |  |     doc_ids: [row.id], | 
 |  |  |     run: run | 
 |  |  |   }); | 
 |  |  |   if (data.code == 0) { | 
 |  |  |     fetchData({ | 
 |  |  |       kb_id: tabs.value[selectedTab.value].id, | 
 |  |  |       page: 1, | 
 |  |  |       page_size: 20 | 
 |  |  |     }); | 
 |  |  |   } 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(async () => { | 
 |  |  |   // const  {data}  = await queryKbtenantInfo(); | 
 |  |  |   // Object.assign(kbtenantInfo,data); | 
 |  |  |   // console.log(kbtenantInfo,'kbtenantInfo的数据'); | 
 |  |  |  | 
 |  |  | }); | 
 |  |  | onMounted(() => { | 
 |  |  |   knowledgeData(); | 
 |  |  | }); | 
 |  |  |  | 
 |  |  | </script> | 
 |  |  |  | 
 |  |  | <style scoped lang="less"> | 
 |  |  | .container { | 
 |  |  |   padding: 0 20px 20px 20px; | 
 |  |  |   .container { | 
 |  |  |     padding: 0 20px 20px 20px; | 
 |  |  |  | 
 |  |  |   .main-container { | 
 |  |  |     display: flex; | 
 |  |  |     width: 100%; | 
 |  |  |  | 
 |  |  |     .lf-container { | 
 |  |  |     .main-container { | 
 |  |  |       display: flex; | 
 |  |  |       flex-direction: column; | 
 |  |  |       align-items: center; | 
 |  |  |       //justify-content: space-evenly; | 
 |  |  |       border-radius: 8px; | 
 |  |  |       background: var(--color-bg-2); | 
 |  |  |       width: 200px; | 
 |  |  |       width: 100%; | 
 |  |  |  | 
 |  |  |       .lf-container-top { | 
 |  |  |         display: flex; | 
 |  |  |         margin: 10px 0; | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       .lf-container-down { | 
 |  |  |       .lf-container { | 
 |  |  |         display: flex; | 
 |  |  |         flex-direction: column; | 
 |  |  |         box-sizing: border-box; | 
 |  |  |         width: 90%; | 
 |  |  |         height: calc(100% - 80px); | 
 |  |  |         border: 1px solid var(--color-fill-3); | 
 |  |  |         align-items: center; | 
 |  |  |         //justify-content: space-evenly; | 
 |  |  |         border-radius: 8px; | 
 |  |  |         //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; | 
 |  |  |           padding-right: 20%; | 
 |  |  |           font-size: 14px; | 
 |  |  |           height: 40px; | 
 |  |  |           line-height: 40px; | 
 |  |  |           list-style: none; | 
 |  |  |           position: relative; | 
 |  |  |           color: var(--color-text-1); | 
 |  |  |           border: 1px solid var(--color-neutral-3); | 
 |  |  |           background: var(--color-bg-2); | 
 |  |  |           border-radius: 8px; | 
 |  |  |           overflow: hidden; /* 确保超出容器的文本被隐藏 */ | 
 |  |  |           white-space: nowrap; /* 防止文本换行 */ | 
 |  |  |           text-overflow: ellipsis; /* 超出部分显示省略号 */ | 
 |  |  |         } | 
 |  |  |         background: var(--color-bg-2); | 
 |  |  |         width: 200px; | 
 |  |  |  | 
 |  |  |         .tab:hover { | 
 |  |  |           color: #2a2a2b; | 
 |  |  |           border: 1px solid var(--color-neutral-3); | 
 |  |  |           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 { | 
 |  |  |           color: #2a2a2b; | 
 |  |  |           border: 1px solid var(--color-neutral-1); | 
 |  |  |           background: #e8e8ea; | 
 |  |  |           cursor: pointer; | 
 |  |  |         } | 
 |  |  |       } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     .rt-container { | 
 |  |  |       position: relative; | 
 |  |  |       //background: #626aea; | 
 |  |  |       margin-left: 20px; | 
 |  |  |       width: calc(100% - 200px); | 
 |  |  |       overflow: hidden; | 
 |  |  |  | 
 |  |  |       .rt-container-main { | 
 |  |  |         overflow: auto; | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       .details { | 
 |  |  |         position: absolute; | 
 |  |  |         top: 0; | 
 |  |  |         left: 0; | 
 |  |  |         width: 100%; | 
 |  |  |         height: 100%; | 
 |  |  |         background: #ffffff; | 
 |  |  |  | 
 |  |  |         .details-header { | 
 |  |  |         .lf-container-top { | 
 |  |  |           display: flex; | 
 |  |  |           justify-content: space-between; | 
 |  |  |           margin-top: 10px; | 
 |  |  |           padding-right: 20px; | 
 |  |  |           margin: 10px 0; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         .lf-container-down { | 
 |  |  |           display: flex; | 
 |  |  |           flex-direction: column; | 
 |  |  |           box-sizing: border-box; | 
 |  |  |           width: 90%; | 
 |  |  |           height: calc(100% - 80px); | 
 |  |  |           border: 1px solid var(--color-fill-3); | 
 |  |  |           border-radius: 8px; | 
 |  |  |           //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; | 
 |  |  |             padding-right: 20%; | 
 |  |  |             font-size: 14px; | 
 |  |  |             height: 40px; | 
 |  |  |             line-height: 40px; | 
 |  |  |             list-style: none; | 
 |  |  |             position: relative; | 
 |  |  |             color: var(--color-text-1); | 
 |  |  |             border: 1px solid var(--color-neutral-3); | 
 |  |  |             background: var(--color-bg-2); | 
 |  |  |             border-radius: 8px; | 
 |  |  |             overflow: hidden; /* 确保超出容器的文本被隐藏 */ | 
 |  |  |             white-space: nowrap; /* 防止文本换行 */ | 
 |  |  |             text-overflow: ellipsis; /* 超出部分显示省略号 */ | 
 |  |  |           } | 
 |  |  |  | 
 |  |  |           .tab:hover { | 
 |  |  |             color: #2a2a2b; | 
 |  |  |             border: 1px solid var(--color-neutral-3); | 
 |  |  |             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 { | 
 |  |  |             color: #2a2a2b; | 
 |  |  |             border: 1px solid var(--color-neutral-1); | 
 |  |  |             background: #e8e8ea; | 
 |  |  |             cursor: pointer; | 
 |  |  |           } | 
 |  |  |         } | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       .rt-container { | 
 |  |  |         position: relative; | 
 |  |  |         //background: #626aea; | 
 |  |  |         margin-left: 20px; | 
 |  |  |         width: calc(100% - 200px); | 
 |  |  |         overflow: hidden; | 
 |  |  |  | 
 |  |  |         .rt-container-main { | 
 |  |  |           overflow: auto; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         .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; | 
 |  |  |   :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 { | 
 |  |  |   .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> |