From 8a67c292deeacaf228e0a5489b4c26a1fdd83803 Mon Sep 17 00:00:00 2001
From: zhangxiao <898441624@qq.com>
Date: 星期四, 29 八月 2024 09:34:17 +0800
Subject: [PATCH] fix: 出题机器开发

---
 src/views/sessionManager/components/updataFile.vue |  534 +++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 371 insertions(+), 163 deletions(-)

diff --git a/src/views/sessionManager/components/updataFile.vue b/src/views/sessionManager/components/updataFile.vue
index ecd2970..f1e9980 100644
--- a/src/views/sessionManager/components/updataFile.vue
+++ b/src/views/sessionManager/components/updataFile.vue
@@ -1,18 +1,7 @@
 <template>
-  <a-popover
-    :popup-visible="visible"
-    title=""
-    trigger="click"
-    position="tl">
-    <a-button
-      type="text"
-      style="border-radius: 24px"
-      @click="visibleChange"
-    >
-      <icon-attachment
-        size="28"
-        style="color: #0960bd"
-      />
+  <a-popover :popup-visible="visible" title="" trigger="click" position="tl">
+    <a-button type="text" style="border-radius: 24px" @click="visibleChange">
+      <icon-attachment size="28" style="color: #0960bd" />
     </a-button>
     <template #title>
       <div style="display: flex; justify-content: space-between">
@@ -31,29 +20,55 @@
         ref="uploadRef"
         @change="onChange"
         multiple
+        :limit="1"
       />
-      <div style="width: 100%;margin-top: 10px;display: flex; justify-content: space-between;">
+      <div
+        style="
+          width: 100%;
+          margin-top: 10px;
+          display: flex;
+          justify-content: space-between;
+        "
+        class="upload-wrap"
+      >
         <div>
           <span>瑙f瀽鏂规硶: </span>
-          <a-radio-group v-model="parser_id">
-            <a-radio
-              v-for="item in parser_ids"
-              :key="item.value"
-              :value="item.value"
-              style="margin-right: 10px"
-            >{{item.name}}</a-radio>
+          <a-radio-group
+            v-model="parser_id"
+            style="width: 400px"
+            @change="parserChange"
+          >
+            <a-popover v-for="item in filterData" :key="item.value">
+              <a-radio :value="item.value" style="margin-right: 10px">{{
+                item.name
+              }}</a-radio>
+
+              <template #content>
+                <p>{{ item.parser_config_str }}</p>
+              </template>
+            </a-popover>
           </a-radio-group>
         </div>
+        <a-select
+          :style="{ width: '100px', margin: '0 10px' }"
+          :default-value="['閫氱敤', '澶氭ā鎬�']"
+          v-model="parser_configs"
+          multiple
+          size="small"
+        >
+          <a-option v-for="item in parser_ids" :key="item.value">{{
+            item.name
+          }}</a-option>
+        </a-select>
+        <p class="config-text">鏇村閰嶇疆</p>
         <a-button
           :loading="onFileSelectedLoading"
           @click="upDataFile"
           type="primary"
           size="mini"
-          style="border-radius: 24px;"
+          style="border-radius: 24px"
         >
-          <span style="font-size: 12px;">
-            涓婁紶
-          </span>
+          <span style="font-size: 12px"> 涓婁紶 </span>
         </a-button>
       </div>
     </template>
@@ -61,155 +76,348 @@
 </template>
 
 <script lang="ts" setup>
-import { onMounted, onBeforeMount, reactive, ref, computed, watch } from "vue";
-import axios from "axios";
-import { Message } from "@arco-design/web-vue";
-import { uploadWithoutKb } from "@/api/session";
+  import {
+    onMounted,
+    onBeforeMount,
+    reactive,
+    ref,
+    computed,
+    watch,
+  } from 'vue';
+  import axios from 'axios';
+  import { Message } from '@arco-design/web-vue';
+  import {
+    addSessionApi,
+    getParseMethodsListApi,
+    getSessionDetailsApi,
+    uploadWithoutKb,
+    uploadAndParse,
+  } from '@/api/session';
 
-const visible = ref(false);
-const loading = ref(false);
-const chatDis = ref(false);
-const directory = ref(false);
-const filesBtn = ref(null);
-const onFileSelectedLoading = ref(false);
-const parser_id = ref("");
-const parser_ids = ref([]);
-const uploaditemList = ref([]);
-const activeSessionId = ref('');
-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: 'wanghaos 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',
-  parser_ids: 'naive:閫氱敤,qa:Q&A,resume:绠�鍘�,manual:璇存槑涔�,table:琛ㄦ牸,paper:澶氭ā鎬�,book:涔︾睄,laws:娉曞緥鏂囦欢,presentation:PPT,picture:鍥剧墖,one:鏁翠綋',
-  rerank_id: 'BAAI/bge-reranker-v2-m3',
-  role: 'owner',
-  tenant_id: '948fc6fa41ab11ef8fb80242ac120004',
-  parser_idObj: {},
-});
-const uploadList = ref([]);
-const parser = reactive({
-  naive: {
-    "chunk_token_num": 676,
-    "layout_recognize": true,
-    "raptor": {
-      "use_raptor": true,
-      "prompt": "璇锋�荤粨浠ヤ笅娈佃惤銆� 灏忓績鏁板瓧锛屼笉瑕佺紪閫犮�� 娈佃惤濡備笅锛歕n      {cluster_content}\n浠ヤ笂灏辨槸浣犻渶瑕佹�荤粨鐨勫唴瀹广��",
-      "max_token": 600,
-      "threshold": 0.32,
-      "max_cluster": 233,
-      "random_seed": 1500
-    }
-  }, // 鐢ㄦ埛鍚�
-
-});
-const props = defineProps(["sessionId"]);
-const emit = defineEmits(["selectFileCallback"]);
-const uploadRef = ref();
-const files = ref([]);
-const acceptNameList = computed(() => {
-  return ".word, .pdf, .ppt, .excel, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .pptx, .ppt, .pdf, .mp4, .avi, .mp3,.wav, .wma, .wmv, .rm,";
-});
-
-const init = () => {
-  parser_ids.value = kbtenantInfo.parser_ids.split(",").map((item) => {
-    const [value1, value2] = item.split(":");
-    return {
-      name: value2,
-      value: value1
-    };
+  const visible = ref(false);
+  const loading = ref(false);
+  const chatDis = ref(false);
+  const directory = ref(false);
+  const filesBtn = ref(null);
+  const onFileSelectedLoading = ref(false);
+  const parser_id = ref('');
+  const parseridConfig = ref(false);
+  const uploaditemList = ref([]);
+  const activeSessionId = ref('');
+  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: 'wanghaos 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',
+    parser_ids:
+      'naive:閫氱敤,qa:Q&A,resume:绠�鍘�,manual:璇存槑涔�,table:琛ㄦ牸,paper:澶氭ā鎬�,book:涔︾睄,laws:娉曞緥鏂囦欢,presentation:PPT,picture:鍥剧墖,one:鏁翠綋',
+    rerank_id: 'BAAI/bge-reranker-v2-m3',
+    role: 'owner',
+    tenant_id: '948fc6fa41ab11ef8fb80242ac120004',
+    parser_idObj: {},
   });
-}
+  const parser = reactive({
+    naive: {
+      chunk_token_num: 676,
+      layout_recognize: true,
+      raptor: {
+        use_raptor: true,
+        prompt:
+          '璇锋�荤粨浠ヤ笅娈佃惤銆� 灏忓績鏁板瓧锛屼笉瑕佺紪閫犮�� 娈佃惤濡備笅锛歕n      {cluster_content}\n浠ヤ笂灏辨槸浣犻渶瑕佹�荤粨鐨勫唴瀹广��',
+        max_token: 600,
+        threshold: 0.32,
+        max_cluster: 233,
+        random_seed: 1500,
+      },
+    }, // 鐢ㄦ埛鍚�
+    qa: {
+      entity_types: ['organization', 'person', 'location', 'event', 'time'],
+      raptor: {
+        use_raptor: false,
+      },
+    },
+    resume: {},
+    manual: {},
+    table: {},
+    paper: {},
+    book: {},
+    laws: {},
+    presentation: {},
+    picture: {},
+    one: {},
+  });
+  const parser_configs = ref(['閫氱敤', '澶氭ā鎬�']);
+  const parser_ids = ref([
+    {
+      name: '閫氱敤',
+      value: 'naive',
+      parser_config: parser.naive,
+      parser_config_str: '鏀寔鐨勬枃浠舵牸寮忎负DOCX銆丒XCEL銆丳PT銆両MAGE銆丳DF銆乀XT',
+    },
+    {
+      name: 'Q&A',
+      value: 'qa',
+      parser_config: parser.qa,
+      parser_config_str:
+        '鏀寔 excel 鍜� csv/txt 鏂囦欢鏍煎紡銆� \n' +
+        '濡傛灉鏂囦欢浠� excel 鏍煎紡锛屽垯搴旂敱涓や釜鍒楃粍鎴� 娌℃湁鏍囬锛氫竴涓彁鍑洪棶棰橈紝鍙︿竴涓敤浜庣瓟妗堬紝 绛旀鍒椾箣鍓嶇殑闂鍒椼�俓n' +
+        '濡傛灉鏂囦欢浠� csv/txt 鏍煎紡涓� 鐢ㄤ綔鍒嗗紑闂鍜岀瓟妗堢殑瀹氱晫绗︺�俓n',
+    },
+    {
+      name: '绠�鍘�',
+      value: 'resume',
+      parser_config: parser.resume,
+      parser_config_str: '鏀寔鐨勬枃浠舵牸寮忎负DOCX銆丳DF銆乀XT',
+    },
+    {
+      name: '璇存槑涔�',
+      value: 'manual',
+      parser_config: parser.manual,
+      parser_config_str: '浠呮敮鎸丳DF',
+    },
+    {
+      name: '琛ㄦ牸',
+      value: 'table',
+      parser_config: parser.table,
+      parser_config_str:
+        '鏀寔EXCEL鍜孋SV/TXT鏍煎紡鏂囥�� \n' +
+        '瀵逛簬 csv 鎴� txt 鏂囦欢锛屽垪涔嬮棿鐨勫垎闅旂涓� TAB锛孿n' +
+        '绗竴琛屽繀椤绘槸鍒楁爣棰樸�俓n',
+    },
+    {
+      name: '澶氭ā鎬�',
+      value: 'paper',
+      parser_config: parser.paper,
+      parser_config_str: '浠呮敮鎸丳DF鏂囦欢',
+    },
+    {
+      name: '涔︾睄',
+      value: 'book',
+      parser_config: parser.book,
+      parser_config_str: '鏀寔鐨勬枃浠舵牸寮忎负DOCX銆丳DF銆乀XT',
+    },
+    {
+      name: '娉曞緥鏂囦欢',
+      value: 'laws',
+      parser_config: parser.laws,
+      parser_config_str: '鏀寔鐨勬枃浠舵牸寮忎负DOCX銆丳DF銆乀XT',
+    },
+    {
+      name: 'PPT',
+      value: 'presentation',
+      parser_config: parser.presentation,
+      parser_config_str: '鏀寔鐨勬枃浠舵牸寮忎负PDF銆丳PTX',
+    },
+    {
+      name: '鍥剧墖',
+      value: 'picture',
+      parser_config: parser.picture,
+      parser_config_str: '鏀寔鍥惧儚鏂囦欢',
+    },
+    {
+      name: '鏁翠綋',
+      value: 'one',
+      parser_config: parser.one,
+      parser_config_str: '鏀寔鐨勬枃浠舵牸寮忎负DOCX銆丒XCEL銆丳DF銆乀XT',
+    },
+  ]);
+  const parser_idsArr = ref([]);
+  const uploadList = ref([]);
+  const props = defineProps(['sessionId']);
+  const emit = defineEmits(['selectFileCallback']);
+  const uploadRef = ref();
+  const files = ref([]);
+  const acceptNameList = computed(() => {
+    return '.word, .pdf, .ppt, .excel, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .pptx, .ppt, .pdf, .mp4, .avi, .mp3,.wav, .wma, .wmv, .rm,';
+  });
 
-const onChange = (fileList) => {
-  files.value = fileList;
-};
+  const filterData = computed(() => {
+    const result = parser_ids.value
+      .filter((val) => parser_configs.value.includes(val.name))
+      .reverse()
+      .slice(0, 4)
+      .reverse();
+    result.unshift({
+      name: '鏅鸿兘璇嗗埆',
+      value: '',
+      parser_config_str: '',
+      parser_config: '',
+    });
+    return result;
+  });
 
-const visibleChange = (e) => {
-  e.stopPropagation();
-  visible.value = !visible.value;
-}
+  const init = () => {
+    // parser_ids.value = kbtenantInfo.parser_ids.split(",").map((item) => {
+    //   const [value1, value2] = item.split(":");
+    //   return {
+    //     name: value2,
+    //     value: value1
+    //   };
+    // });
+    getParseMethodsList();
+  };
 
-const upDataFile = () => {
-  console.log(files.value, "files");
-  console.log(parser_ids.value, "瑙f瀽鏂规硶");
-  if(files.value.length == 0){
-    Message.warning('璇烽�夋嫨鏂囦欢');
-    return;
-  }
-  uploaditemList.value = files.value.map((item,index)=>{
-    return {
-      index: index,
-      name: item.name,
-      size: (item.file.size/1024).toFixed(2) + 'K',
+  const chooseParser = (item) => {
+    console.log(item);
+  };
+
+  const onChange = (fileList) => {
+    files.value = fileList;
+    files.value.forEach((item) => {});
+  };
+  const parserChange = () => {
+    parseridConfig.value = false;
+  };
+
+  const visibleChange = (e) => {
+    e.stopPropagation();
+    visible.value = !visible.value;
+  };
+
+  const getIconByExtension = (extension) => {
+    const fileExtension = ref('');
+    fileExtension.value = extension.split('.').pop();
+    let type = '';
+    parser_idsArr.value.forEach((item) => {
+      // 鍖呭惈鍏冪礌
+      if (item.formats.includes(fileExtension.value)) {
+        type = item.id;
+      }
+    });
+    return type;
+  };
+
+  const upDataFile = async () => {
+    if (!activeSessionId.value) {
+      //鏂板缓浼氳瘽
+      const res = await addSessionApi({
+        dialog_id: '',
+        conversation_desc: '',
+      });
+      // console.log(res, "res");
+      if (res.code == 200) {
+        // console.log(res.data.conversation_id);
+        activeSessionId.value = res.data?.conversation_id;
+        const { code, data } = await getSessionDetailsApi(
+          res.data?.conversation_id
+        );
+        if (code === 200) {
+          console.log(data, '鏂板缓浼氳瘽璇︽儏');
+        }
+      } else {
+        Message.error('鍒涘缓浼氳瘽澶辫触锛岃閲嶈瘯');
+      }
     }
-  })
-  // onFileSelectedLoading.value = true;
-  // const formData = new FormData();
-  // for (let i = 0; i < files.value.length; i++) {
-  //   formData.append('file', files.value[i].file);
-  //   formData.append('conversation_id', activeSessionId.value);
-  //   formData.append('parser_id', parser_id.value);
-  //   formData.append('parser_config', '');
-  // }
-  // uploadWithoutKb(formData).then((res) => {
-  //   onFileSelectedLoading.value = false;
-  //   if (res.code == 200) {
-  //     cancel();
-  //     // uploaditemList.value = [];
-  //     emit('selectFileCallback', uploaditemList.value);
-  //     Message.success('涓婁紶鎴愬姛');
-  //   } else {
-  //     Message.error('涓婁紶澶辫触');
-  //   }
-  // });
 
-  cancel();
-  emit('selectFileCallback', uploaditemList.value);
+    console.log(files.value, 'files');
+    console.log(parser_ids.value, '瑙f瀽鏂规硶');
+    if (files.value.length == 0) {
+      Message.warning('璇烽�夋嫨鏂囦欢');
+      return;
+    }
+    uploaditemList.value = files.value.map((item, index) => {
+      return {
+        index: index,
+        name: item.name,
+        size: (item.file.size / 1024).toFixed(2) + 'K',
+      };
+    });
+    onFileSelectedLoading.value = true;
+    const formData = new FormData();
+    for (let i = 0; i < files.value.length; i++) {
+      formData.append('file', files.value[i].file);
+      formData.append('conversation_id', activeSessionId.value);
+      formData.append('parser_config', '');
+      if (!parser_id.value) {
+        formData.append('parser_id', getIconByExtension(files.value[i].name));
+      } else {
+        formData.append('parser_id', parser_id.value);
+      }
+    }
+    console.log(formData, 'formData');
+    // uploadAndParse(formData).then((res) => {
+    //   debugger;
+    //   onFileSelectedLoading.value = false;
+    //   if (res.code == 200) {
+    //     cancel();
+    //     // uploaditemList.value = [];
+    //     emit('selectFileCallback', uploaditemList.value);
+    //     Message.success('涓婁紶鎴愬姛');
+    //   } else {
+    //     Message.error('涓婁紶澶辫触');
+    //   }
+    // });
+    uploadWithoutKb(formData).then((res) => {
+      onFileSelectedLoading.value = false;
+      if (res.code == 200) {
+        cancel();
+        // uploaditemList.value = [];
+        emit('selectFileCallback', uploaditemList.value);
+        Message.success('涓婁紶鎴愬姛');
+      } else {
+        Message.error('涓婁紶澶辫触');
+      }
+    });
+  };
 
+  const cancel = () => {
+    if (!onFileSelectedLoading.value) {
+      visible.value = false;
+      parser_id.value = '';
+    }
+  };
 
+  defineExpose({
+    cancel,
+  });
 
-};
+  const getParseMethodsList = async () => {
+    let res = await getParseMethodsListApi();
+    parser_ids.value = res.data.map((item) => {
+      console.log(item, item.parser_config_str, 78787);
+      return {
+        name: item.name,
+        value: item.id,
+        parser_config: '',
+        parser_config_str: JSON.stringify(item.formats),
+      };
+    });
+    parser_idsArr.value = res.data;
+  };
 
+  onBeforeMount(() => {
+    init();
+  });
+  onMounted(() => {});
 
-const cancel = () => {
-  if(!onFileSelectedLoading.value){
-    visible.value = false;
-    parser_id.value = "";
-  }
-};
-
-defineExpose({
-  cancel
-})
-
-
-onBeforeMount(() => {
-  init();
-
-
-
-});
-onMounted(() => {
-});
-
-watch(
-  ()=>props.sessionId,
-  (value, oldValue)=>{
-     activeSessionId.value = value;
-  }
-)
-
-
+  watch(
+    () => props.sessionId,
+    (value, oldValue) => {
+      activeSessionId.value = value;
+    }
+  );
 </script>
-
+<style>
+  .upload-wrap .arco-select-view-inner {
+    display: none;
+  }
+</style>
 <style scoped lang="less">
-.aUpload {
-  width: 100%;
-  max-height: 500px;
-  overflow: hidden;
-  overflow-y: auto;
-}
+  .aUpload {
+    width: 100%;
+    max-height: 500px;
+    overflow: hidden;
+    overflow-y: auto;
+  }
+  .upload-wrap {
+    position: relative;
+  }
+  .config-text {
+    position: absolute;
+    right: 70px;
+    bottom: -11px;
+    font-size: 12px;
+  }
 </style>

--
Gitblit v1.8.0