| | |
| | | </div> |
| | | <div class="pc-mouldboard column exampleSlide"> |
| | | <div class="header flex items-center justify-center"> |
| | | <!-- <div |
| | | class="box-border flex w-[234px] h-[32px] rounded-md items-center justify-between cursor-pointer relative border border-solid border-[#2c2d33]" |
| | | > |
| | | <div |
| | | class="tabbar-item" |
| | | :class="activeGroupType.value === item.ID ? 'set-tabbar-active' : ''" |
| | | @click="handleTabClick(item)" |
| | | v-for="item in state.tabNameList" |
| | | :key="item.ID" |
| | | > |
| | | {{ item.Name }} |
| | | </div> |
| | | </div> --> |
| | | <i |
| | | class="ywifont ywicon-guanbi text-[#999] text-[18px] absolute right-[14px] top-5 cursor-pointer" |
| | | @click="handleCloseTemplate" |
| | |
| | | <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="activeGroupType == '办公助手'"> |
| | | <div class="flex flex-col w100 h100 pt-0 pr-[15px] pb-0 pl-[20px]"> |
| | | <div class="flex items-center w100 h-[30px] border border-solid border-[#b2b2b2] transition-[border-color 1s] rounded-2xl"> |
| | | <el-input v-model="officeParams.template_title" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable> |
| | | <el-input v-model="officeParams.sample_title" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable> |
| | | </el-input> |
| | | </div> |
| | | <div class="mt10 w100 relative h100" v-show="state.customOfficeList.length > 0"> |
| | |
| | | </div> |
| | | </div> |
| | | <div class="mt10 w100 overflow-auto set-height-custom"> |
| | | <div class="w100 pb-[20px] flex flex-col" v-for="item in finalOfficeList" :key="item.group_id"> |
| | | <div class="w100 pb-[20px] flex flex-col" v-for="item in finalOfficeList" :key="item.sample_id"> |
| | | <div class="bg-[#f5f7fd] p-[12px] transition-[background-color .2s] flex flex-col rounded-2xl"> |
| | | <div class="flex justify-between"> |
| | | <span class="set-title">{{ item.template_title }}</span> |
| | | <span class="set-title">{{ item.sample_title }}</span> |
| | | </div> |
| | | <div class="example-body ellipsis">{{ item.template_value }}</div> |
| | | <div class="example-body ellipsis">{{ item.sample_question }}</div> |
| | | <div class="example-bottom"> |
| | | <span class="example-item">{{ item.template_type }}</span> |
| | | <el-button type="primary" class="set-button" @click="templateUseClick(item)">使用</el-button> |
| | |
| | | <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="activeGroupType == '知识库'"> |
| | | <div class="flex flex-col w100 h100 pt-0 pr-[15px] pb-0 pl-[20px]"> |
| | | <div class="flex items-center w100 h-[30px] border border-solid border-[#b2b2b2] transition-[border-color 1s] rounded-2xl"> |
| | | <el-input v-model="queryParams.sample_title" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable> |
| | | <el-input v-model="knowledgeParams.sample_title" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable> |
| | | </el-input> |
| | | </div> |
| | | <div class="mt10 w100 relative h100" v-show="state.knowledgeBaseList.length > 0"> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <el-dialog v-model="state.useInstructDialog" :title="state.instructInfo?.template_title" width="500" :before-close="handleClose"> |
| | | <el-dialog v-model="state.useInstructDialog" :title="state.instructInfo?.sample_title" width="500" :before-close="handleClose"> |
| | | <el-input v-model="state.inputInstruct" :rows="10" type="textarea"></el-input> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | |
| | | <script setup lang="ts"> |
| | | import { Search } from '@element-plus/icons-vue'; |
| | | import { computed, reactive, ref, watch } from 'vue'; |
| | | import { getSectionList, getSelectSample, getUserTemplateList } from '/@/api/ai/chat'; |
| | | import { useSearch } from '/@/hooks/useSearch'; |
| | | import { activeGroupType, activeRoomId, activeSampleId, activeSectionAId, sectionAList, setRoomConfig } from '/@/stores/chatRoom'; |
| | | import { |
| | | activeGroupType, |
| | | activeRoomId, |
| | | activeSampleId, |
| | | activeSectionAId, |
| | | exampleSceneList, |
| | | sceneGroupList, |
| | | sectionAList, |
| | | setRoomConfig, |
| | | } from '/@/stores/chatRoom'; |
| | | import { convertListToTree, debounce } from '/@/utils/util'; |
| | | import { OptClassificationMap, classificationEnum } from '/@/views/types/processDrawing/index'; |
| | | let state = reactive({ |
| | |
| | | exampleRandomContent: [], |
| | | exampleContent: [], |
| | | listSampleLoading: false, |
| | | listInstructLoading: false, |
| | | listSampleExpand: false, |
| | | listInstructExpand: false, |
| | | }); |
| | | //#region ====================== 传参 ====================== |
| | | const isShow = defineModel('isShow', { |
| | |
| | | const exampleList = ref([]); //示例列表 |
| | | //获取模版列表 |
| | | const getSelectListSample = async () => { |
| | | state.listSampleLoading = true; |
| | | const res = await getSelectSample({}).finally(() => { |
| | | state.listSampleLoading = false; |
| | | }); |
| | | state.exampleRandomContent = res.samples; |
| | | const array = []; |
| | | res.samples.forEach((sample, index) => { |
| | | sample.Icon = '/static/images/wave/ChatImg.png'; |
| | | sample.BgColor = randomHexColor(); |
| | | if (index < 4) { |
| | | array.push(sample); |
| | | } |
| | | }); |
| | | exampleList.value = res.samples; |
| | | state.exampleContent = array; |
| | | exampleList.value = exampleSceneList.value; |
| | | }; |
| | | //随机生成颜色 |
| | | const randomHexColor = () => { |
| | | return `#${Math.floor(Math.random() * 16777215) |
| | | .toString(16) |
| | | .padEnd(6, '0')}`; |
| | | }; |
| | | |
| | | const changeExample = (item) => { |
| | | emit('updateChatInput', item.sample_question); |
| | | setRoomConfig(activeRoomId.value, 'isAnswerByLLM', false); |
| | |
| | | }; |
| | | //获取用户模板 |
| | | const getUserTemplate = async () => { |
| | | state.listInstructLoading = true; |
| | | const res = await getUserTemplateList().finally(() => { |
| | | state.listInstructLoading = false; |
| | | }); |
| | | instructContentList.value = res.templates; |
| | | instructContentList.value = exampleSceneList.value; |
| | | }; |
| | | //#endregion |
| | | //#region ====================== 默认选择第一个的场景的子场景 ====================== |
| | |
| | | }; |
| | | //获取主场景列表 |
| | | const getMainSectionList = async () => { |
| | | const res = await getSectionList(); |
| | | const iconList = [ |
| | | 'biaodan', |
| | | 'putong', |
| | |
| | | 'jinridaiban', |
| | | 'gongju', |
| | | ]; |
| | | res.groups.forEach((sectionItem, index) => { |
| | | await sceneGroupList.value.forEach((sectionItem, index) => { |
| | | sectionItem.Icon = iconList[index]; |
| | | }); |
| | | sectionAList.value = res.groups; |
| | | sectionAList.value = sceneGroupList.value; |
| | | tagListClick(sectionAList.value); |
| | | }; |
| | | const loadingData = ref(false); |
| | |
| | | loadingData.value = false; |
| | | }); |
| | | if (activeGroupType.value == '业务场景' || activeGroupType.value == '知识库') { |
| | | if (state.listSampleExpand) return; |
| | | await getSelectListSample(); |
| | | state.listSampleExpand = true; |
| | | } |
| | | } |
| | | }; |
| | |
| | | const templateUseClick = (row) => { |
| | | state.useInstructDialog = true; |
| | | state.instructInfo = row; |
| | | state.inputInstruct = row.template_value; |
| | | state.inputInstruct = row.sample_question; |
| | | }; |
| | | const handleClose = () => { |
| | | state.useInstructDialog = false; |
| | |
| | | ); |
| | | //办公 |
| | | const officeParams = ref({ |
| | | template_title: '', |
| | | sample_title: '', |
| | | }); |
| | | const { query: queryInstruct, queryData: showInstructList } = useSearch(instructContentList, officeParams); |
| | | const finalOfficeList = computed(() => { |
| | | const result = showInstructList.value.filter((item) => item.template_group == state.activeOfficeChildName); |
| | | const result = showInstructList.value.filter((item) => item.group_id == state.activeOfficeChildName); |
| | | return result ?? []; |
| | | }); |
| | | const instructQuery = debounce(queryInstruct); |
| | | |
| | | watch( |
| | | () => officeParams.value.template_title, |
| | | () => officeParams.value.sample_title, |
| | | (val) => { |
| | | instructQuery(); |
| | | } |
| | | ); |
| | | //知识库 |
| | | const knowledgeParams = ref({ |
| | | template_title: '', |
| | | sample_title: '', |
| | | }); |
| | | const { query: queryKnowledge, queryData: showKnowledgeList } = useSearch(exampleList, knowledgeParams); |
| | | const finalKnowledgeList = computed(() => { |
| | |
| | | const knowledgeQuery = debounce(queryKnowledge); |
| | | |
| | | watch( |
| | | () => officeParams.value.template_title, |
| | | () => knowledgeParams.value.sample_title, |
| | | (val) => { |
| | | knowledgeQuery(); |
| | | } |
| | |
| | | () => activeGroupType.value, |
| | | async (val) => { |
| | | if (val == '办公助手') { |
| | | if (state.listInstructExpand) return; |
| | | await getUserTemplate(); |
| | | state.listInstructExpand = true; |
| | | } else { |
| | | await getSelectListSample(); |
| | | } |
| | | tagListClick(sectionAList.value); |
| | | }, |