liudong
2024-08-08 2f5fbb2144ca03477eb91ab36a990ea013065214
src/views/dmx/knowledgeLib/tool.vue
@@ -39,16 +39,11 @@
              @submit="handleSubmit"
            >
              <a-divider style="margin-top: 10px" />
              <a-form-item
                field="slider"
                label="块token数"
                :rules="[
                  { type: 'number', min: 1, message: 'slider is min than 1' },
                ]"
              >
              <a-form-item field="slider" label="块Token数">
                <a-slider
                  v-model="form.chunk_token_num"
                  :max="1000"
                  :min="0"
                  :max="2048"
                  show-input
                />
              </a-form-item>
@@ -65,40 +60,38 @@
                <a-form-item field="prompt" label="提示词">
                  <a-textarea
                    v-model="form.prompt"
                    style="
                      height: 10rem;
                      border: 1px solid var(--color-fill-3);
                      border-radius: 4px;
                    "
                    placeholder="请填写提示词"
                  />
                </a-form-item>
                <a-form-item
                  field="slider"
                  label="最大token数"
                  :rules="[
                    { type: 'number', min: 5, message: 'slider is min than 5' },
                  ]"
                >
                <a-form-item field="slider" label="最大token数">
                  <a-slider
                    v-model="form.max_token"
                    :min="1"
                    :max="1000"
                    :min="0"
                    :max="2048"
                    show-input
                  />
                </a-form-item>
                <a-form-item
                  field="slider"
                  label="阈值"
                  :rules="[
                    { type: 'number', min: 5, message: 'slider is min than 5' },
                  ]"
                >
                  <a-slider v-model="form.threshold" show-tooltip show-input />
                <a-form-item field="slider" label="阈值">
                  <a-slider
                    v-model="form.threshold"
                    :step="0.01"
                    :min="0"
                    :max="1"
                    show-input
                  />
                </a-form-item>
                <a-form-item
                  field="slider"
                  label="最大聚类数"
                  :rules="[
                    { type: 'number', min: 5, message: 'slider is min than 5' },
                  ]"
                >
                  <a-slider v-model="form.max_cluster" :max="1000" show-input />
                <a-form-item field="slider" label="最大聚类数">
                  <a-slider
                    v-model="form.max_cluster"
                    :min="1"
                    :max="1024"
                    show-input
                  />
                </a-form-item>
                <a-form-item
                  field="slider"
@@ -180,7 +173,12 @@
                  </a-space>
                  <a-divider style="margin: 10px 0" />
                  <p>
                    <a-button type="text" class="button" style="color: #2a2a2b">
                    <a-button
                      type="text"
                      class="button"
                      style="color: #2a2a2b"
                      @click="addBlock(1)"
                    >
                      <template #icon>
                        <icon-check-circle />
                      </template>
@@ -188,7 +186,12 @@
                    </a-button>
                  </p>
                  <p>
                    <a-button type="text" class="button" style="color: #2a2a2b">
                    <a-button
                      type="text"
                      class="button"
                      style="color: #2a2a2b"
                      @click="addBlock(0)"
                    >
                      <template #icon>
                        <icon-close-circle />
                      </template>
@@ -197,7 +200,12 @@
                  </p>
                  <a-divider style="margin: 10px 0" />
                  <p>
                    <a-button type="text" class="button" style="color: #2a2a2b">
                    <a-button
                      type="text"
                      class="button"
                      style="color: #2a2a2b"
                      @click="addBlock(3)"
                    >
                      <template #icon>
                        <icon-delete />
                      </template>
@@ -206,10 +214,28 @@
                  </p>
                </template>
              </a-popover>
              <a-space
                direction="vertical"
                size="large"
                style="margin-right: 10px"
                class="space_search"
                v-show="!isBtn"
              >
                <a-input-search
                  :style="{ width: '220px' }"
                  v-model="form.keywords"
                  @input="getList()"
                  allow-clear
                  @clear.stop="getList()"
                  placeholder="搜索"
                />
              </a-space>
              <a-button
                type="outline"
                class="button"
                style="margin-right: 10px"
                v-show="isBtn"
                @click.stop="isBtn = !isBtn"
              >
                <template #icon>
                  <icon-search />
@@ -229,114 +255,80 @@
                    size="large"
                    @change="onChangeavailable"
                  >
                    <a-radio value="">所有</a-radio>
                    <a-radio value="1">启用</a-radio>
                    <a-radio value="0">禁用</a-radio>
                    <a-radio :value="''">所有</a-radio>
                    <a-radio :value="1">启用</a-radio>
                    <a-radio :value="0">禁用</a-radio>
                  </a-radio-group>
                </template>
              </a-popover>
              <addDetails :item="item"></addDetails>
              <addDetails
                :item="item"
                @canplaythrough="canplaythrough"
              ></addDetails>
            </div>
          </div>
          <a-divider style="margin-top: 10px" />
          <div class="groupMain">
            <a-checkbox-group v-model="data" @change="handleChange">
              <div
                class="groupList"
                :style="{ background: keyBg == '1' ? '#eff8ff' : 'white' }"
              >
                <a-checkbox value="1"></a-checkbox>
            <a-spin :loading="isLoading" :tip="tip">
              <a-checkbox-group v-model="data" @change="handleChange">
                <div
                  class="groupList-content"
                  @click="groupListContentClick('1')"
                  @dblclick="contentClick(1)"
                  class="groupList"
                  :class="{
                    groupActive: keyBg == index,
                    groupNoActive: keyBg != index,
                  }"
                  v-for="(item, index) in listData"
                  :key="index"
                >
                  而 stable version 是最新稳定版,经过充分测试和验证,bug 较少,
                  适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions
                  则是之前发布的稳定版,对于需要
                  特定旧版本的兼容性或安全性支持的用户有用,但一般不
                  推荐用于新项目,除非有特殊需求。在实际使用中,如果追求最新功能
                  且愿意面对可能存在的一些不稳定因素,可以尝试使用主线版本进行测试和研究;如果是用于生产环境
                  <a-checkbox :value="item.chunk_id"></a-checkbox>
                  <div
                    class="groupList-content emphaRed"
                    @click="groupListContentClick(index)"
                    @dblclick="contentClick(item)"
                    v-html="item.content_with_weight"
                  >
                  </div>
                  <div class="groupList-right">
                    <a-switch
                      v-model="item.available_int"
                      :checked-value="1"
                      :unchecked-value="0"
                      @change="handleChangeStatus(item)"
                    />
                  </div>
                </div>
                <div class="groupList-right">
                  <a-switch
                    v-model="switchType"
                    checked-value="1"
                    unchecked-value="0"
                    @change="handleChangeStatus()"
                  />
                </div>
              </div>
            </a-checkbox-group>
          </div>
          <a-divider style="margin-top: 10px" />
          <div class="groupMain">
            <a-checkbox-group v-model="data" @change="handleChange">
              <div class="groupList">
                <a-checkbox value="1"></a-checkbox>
                <div
                  class="groupList-content"
                  @click="groupListContentClick('1')"
                  @dblclick="contentClick(1)"
                >
                  而 stable version 是最新稳定版,经过充分测试和验证,bug 较少,
                  适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions
                  则是之前发布的稳定版,对于需要
                  特定旧版本的兼容性或安全性支持的用户有用,但一般不
                  推荐用于新项目,除非有特殊需求。在实际使用中,如果追求最新功能
                  且愿意面对可能存在的一些不稳定因素,可以尝试使用主线版本进行测试和研究;如果是用于生产环境
                </div>
                <div class="groupList-right">
                  <a-switch
                    v-model="switchType"
                    checked-value="1"
                    unchecked-value="0"
                    @change="handleChangeStatus()"
                  />
                </div>
              </div>
              <div class="groupList">
                <a-checkbox value="1"></a-checkbox>
                <div
                  class="groupList-content"
                  @click="groupListContentClick('2')"
                  @dblclick="contentClick(1)"
                >
                  而 stable version 是最新稳定版,经过充分测试和验证,bug 较少,
                  适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions
                  则是之前发布的稳定版,对于需要
                </div>
                <div class="groupList-right">
                  <a-switch
                    v-model="switchType"
                    checked-value="1"
                    unchecked-value="0"
                    @change="handleChangeStatus()"
                  />
                </div>
              </div>
              <div class="groupList-right">
                <a-switch
                  v-model="switchType"
                  checked-value="1"
                  unchecked-value="0"
                  @change="handleChangeStatus()"
                />
              </div>
            </a-checkbox-group>
              </a-checkbox-group>
            </a-spin>
          </div>
        </div>
        <eidtDetails ref="eidtDil"></eidtDetails>
        <eidtDetails
          ref="eidtDil"
          :item="eidtDilinfo"
          v-model:eidtDilVisible="eidtDilVisible"
          @canplaythrough="canplaythrough"
        ></eidtDetails>
      </a-tab-pane>
    </a-tabs>
  </a-modal>
</template>
<script lang="ts" setup>
  import { onMounted, onBeforeMount, reactive, ref, computed } from 'vue';
  import {
    onMounted,
    onBeforeMount,
    reactive,
    ref,
    computed,
    watch,
  } from 'vue';
  import { Message } from '@arco-design/web-vue';
  import { kbdocumentchangeparser } from '@/api/kbList';
  import {
    kbdocumentchangeparser,
    achunkCreate,
    queryChunkList,
    chunkSwitch,
    chunkRm,
  } from '@/api/kbList';
  import addDetails from '@/views/dmx/knowledgeLib/addDetails.vue';
  import eidtDetails from '@/views/dmx/knowledgeLib/eidtDetails.vue';
  const visible = ref(false);
@@ -344,6 +336,8 @@
  const radio = ref('1');
  const keyBg = ref('');
  const eidtDil = ref();
  const eidtDilVisible = ref(false);
  const eidtDilinfo = reactive({});
  const props = defineProps(['kbtenantInfo', 'item', 'kbdetail']);
  // const emit =  defineEmits(['upTabdateItem'])
@@ -362,15 +356,33 @@
    };
  });
  const isBtn = ref(true);
  const closeSlelct = () => {
    window.addEventListener('click', (event) => {
      if (!event.target.closest('.space_search') && !isBtn.value) {
        isBtn.value = true;
        // form.keywords = '';
      }
    });
  };
  watch(isBtn, (val) => {
    if (!val) {
      closeSlelct();
    }
  });
  const form = reactive({
    parser_id: props.item.parser_id,
    doc_id: props.item.id,
    max_token: 698,
    threshold: 30,
    threshold: 0.3,
    max_cluster: 233,
    random_seed: 1500,
    chunk_token_num: 128,
    use_raptor: false,
    keywords: '',
    pages: {},
    prompt:
      '请总结以下段落。 小心数字,不要编造。 段落如下:\n' +
@@ -386,6 +398,9 @@
      },
    ],
  };
  const listData = ref([]);
  const formatter = (value) => {
    return value / 100;
  };
@@ -430,8 +445,9 @@
    visible.value = false;
  };
  const contentClick = (done) => {
    eidtDil.value.handleClick();
  const contentClick = (item) => {
    Object.assign(eidtDilinfo, item);
    eidtDilVisible.value = true;
  };
  const handleOpened = (el) => {
    // console.log('props',props.kbtenantInfo);
@@ -458,11 +474,14 @@
  const onRadioChange = () => {
    console.log(radio.value);
  };
  //批量操作
  const handleChangeAll = (value) => {
    indeterminate.value = false;
    if (value) {
      checkedAll.value = true;
      data.value = ['1', '2', '3'];
      listData.value.forEach((item) => {
        data.value.push(item.chunk_id);
      });
    } else {
      checkedAll.value = false;
      data.value = [];
@@ -470,15 +489,33 @@
  };
  const handleChange = (values) => {
    if (values.length === 3) {
      checkedAll.value = true;
      indeterminate.value = false;
    } else if (values.length === 0) {
      checkedAll.value = false;
      indeterminate.value = false;
    data.value = values;
  };
  //批量启用删除禁用
  const addBlock = (type) => {
    if (data.value.length == 0) {
      Message.error('请选择要操作的数据');
      return;
    }
    if (type == 3) {
      deleteChunk();
    } else {
      checkedAll.value = false;
      indeterminate.value = true;
      let params = {
        chunk_ids: data.value,
        available_int: type,
        doc_id: props.item.id,
      };
      chunkSwitch(params).then((res) => {
        if (res.code == 0) {
          Message.success('操作成功');
          getList();
          checkedAll.value = false;
          data.value = [];
        } else {
          Message.error('操作失败');
        }
      });
    }
  };
@@ -487,27 +524,98 @@
  };
  const onChangeavailable = () => {
    console.log(available_int.value);
    getList();
  };
  const handleChangeStatus = () => {
    console.log(switchType.value);
  const handleChangeStatus = (val) => {
    updateChunkStatus(val);
  };
  const isLoading = ref(true);
  // 自定义加载提示文本
  const tip = '加载中,请稍候...';
  //获取列表
  const getList = async () => {
    let params = {
      doc_id: props.item.id,
      keywords: form.keywords,
      page: 1,
      size: 10000,
    };
    if (available_int.value !== '') {
      params.available_int = available_int.value;
    }
    await queryChunkList(params).then((res) => {
      if (res.code == 0) {
        listData.value = res.data.chunks;
        isLoading.value = false;
        listData.value = listData.value.map((item) => {
          item.available_int = parseInt(item.available_int);
          return item;
        });
      }
    });
  };
  //更新列表
  const canplaythrough = () => {
    getList();
  };
  //启用禁用
  const updateChunkStatus = (val) => {
    let params = {
      chunk_ids: [val.chunk_id],
      available_int: val.available_int,
      doc_id: props.item.id,
    };
    chunkSwitch(params).then((res) => {
      console.log(res);
      if (res.code == 0) {
        Message.success('更新成功');
        getList();
      } else {
        Message.error('更新失败');
      }
    });
  };
  //删除
  const deleteChunk = () => {
    let params = {
      chunk_ids: data.value,
      doc_id: props.item.id,
    };
    chunkRm(params).then((res) => {
      console.log(res);
      if (res.code == 0) {
        Message.success('删除成功');
        getList();
      } else {
        Message.error('删除失败');
      }
    });
  };
  onBeforeMount(() => {});
  onMounted(() => {});
  onMounted(() => {
    getList();
  });
</script>
<style scoped lang="less">
  .parser{
  .parser {
    width: 100%;
    ::v-deep .arco-btn-outline:hover, .arco-btn-outline, .arco-btn-outline[type='button']{
    ::v-deep .arco-btn-outline:hover,
    .arco-btn-outline,
    .arco-btn-outline[type='button'] {
      color: #2a2a2b;
      border: 1px solid #2a2a2b;
    }
    .button{
    .button {
      //color: #2a2a2b!important;
    }
  }
  ::-webkit-scrollbar {
    display: none;
  }
  .groupMain {
    width: 100%;
@@ -515,16 +623,14 @@
    overflow: auto;
    display: flex;
    justify-content: center;
    .groupList {
      display: flex;
      padding: 24px;
      border-radius: 8px;
      //background: #eff8ff;
      border: 1px solid var(--color-neutral-3);
      border: 1px solid #f0f0f0;
      margin-bottom: 20px;
      overflow: auto;
      .groupList-content {
        width: 700px;
        //height: 100px;
@@ -532,44 +638,22 @@
        box-sizing: border-box;
        margin: 0;
        padding: 0;
        color: var(--color-text-1);
        color: #2a2a2b;
        font-size: 14px;
        font-family: Inter;
        position: relative;
      }
    }
  }
  :deep(.emphaRed em) {
    color: red !important;
  }
    .groupMain {
      width: 100%;
      height: 500px;
      overflow: auto;
      display: flex;
      justify-content: center;
      .groupList {
        display: flex;
        padding: 24px;
        border-radius: 8px;
        //background: #eff8ff;
        border: 1px solid #f0f0f0;
        margin-bottom: 20px;
        overflow: auto;
        .groupList-content {
          width: 700px;
          //height: 100px;
          overflow: auto;
          box-sizing: border-box;
          margin: 0;
          padding: 0;
          color: rgba(0, 0, 0, 0.88);
          font-size: 14px;
          font-family: Inter;
          position: relative;
        }
      }
    }
  .groupActive {
    background: #eff8ff;
  }
  .groupNoActive {
    background: var(--color-bg-1);
    color: var(--color-text-1);
  }
</style>