| | |
| | | <template> |
| | | <div class="relative h100" v-loading="loadingData" :style="`width: ${rightBox}px;transition: 0.7s ease-in;`"> |
| | | <div class="retract_icon" @click="toggleShow"> |
| | | <div class="retract_icon" @click="toggleShow" v-if="!isSharePage"> |
| | | <i class="text-[#fff] transition-all" :class="isShow ? 'ywifont ywicon-zuoyoujiantou1' : 'ywifont ywicon-zuoyoujiantou'"></i> |
| | | </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="state.activeName === 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" |
| | | ></i> |
| | | </div> |
| | | |
| | | <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="state.activeName == 1"> |
| | | <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> |
| | | <el-input v-model="searchValue" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable> </el-input> |
| | | </div> |
| | | <div class="mt10 w100 h100 relative" v-show="state.customBusinessList.length > 0"> |
| | | <div class="mt10 w100 h100 relative" v-show="allData[activeGroupType]"> |
| | | <div class="set_custom_label"> |
| | | <div class="chanel-tags"> |
| | | <div |
| | | v-for="(item, index) in state.customBusinessList" |
| | | v-for="(item, index) in allData[activeGroupType]" |
| | | :key="index" |
| | | :class="{ 'set-group-label-active': state.activeBusinessName === item.group_id }" |
| | | class="flex items-center" |
| | | :class="{ 'set-group-label-active': activeMainScene[activeGroupType] === item.group_id }" |
| | | class="flex items-center border border-solid border-[#b2b2b2] rounded-xl mx-[3px] leading-6" |
| | | @click="handleBusinessClick(item)" |
| | | > |
| | | <span class="set-group-name">{{ item.group_name }}</span> |
| | |
| | | </div> |
| | | </div> |
| | | <div |
| | | class="overflow-hidden min-h-[38px] transition-[max-height 0.2s] w100 flex flex-wrap text-xs leading-[14px] items-center" |
| | | class="overflow-hidden min-h-[34px] transition-[max-height 0.2s] w100 flex flex-wrap text-xs leading-[14px] items-center bg-[#f5f7fd]" |
| | | > |
| | | <div |
| | | v-for="(itemChildren, index) in state.customBusinessChildList" |
| | |
| | | {{ itemChildren.group_name }} |
| | | </div> |
| | | </div> |
| | | <div class="mt10 overflow-auto set-height-custom" v-show="finalSampleList.length > 0"> |
| | | <div class="mt10 overflow-auto set-height-custom" v-if="activeGroupType !== '办公助手'"> |
| | | <div class="w100 pb-[20px]" v-for="item in finalSampleList" :key="item.sample_id"> |
| | | <div |
| | | class="cursor-pointer flex box-border p-[12px] w100 rounded bg-[#f5f7fd] transition-[background-color .2s]" |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="mt10 w100" v-show="finalSampleList.length == 0"><el-empty description="暂无数据" /></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="state.activeName == 2"> |
| | | <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> |
| | | </div> |
| | | <div class="mt10 w100 relative h100" v-show="state.customOfficeList.length > 0"> |
| | | <div class="set_custom_label"> |
| | | <div class="chanel-tags"> |
| | | <div |
| | | v-for="(item, index) in state.customOfficeList" |
| | | :key="index" |
| | | :class="{ 'set-group-label-active': state.activeOfficeName === item.group_id }" |
| | | class="flex items-center" |
| | | @click="handleOfficeClick(item)" |
| | | > |
| | | <span class="set-group-name">{{ item.group_name }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div |
| | | class="overflow-hidden min-h-[38px] transition-[max-height 0.2s] w100 flex flex-wrap text-xs leading-[14px] items-center" |
| | | > |
| | | <div |
| | | v-for="(itemChildren, index) in state.customOfficeChildList" |
| | | :key="index" |
| | | :class="{ 'set-label-active': state.activeOfficeChildName === itemChildren.group_id }" |
| | | @click="handleOfficeChildClick(itemChildren)" |
| | | class="cursor-pointer m-[5px] py-[5px] pl-[10px] text-[#999] transition-[background-color .1s, color .1s, border-color .1s]" |
| | | > |
| | | {{ itemChildren.group_name }} |
| | | </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="mt10 w100 overflow-auto set-height-custom" v-else> |
| | | <div class="w100 pb-[20px] flex flex-col" v-for="item in finalSampleList" :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> |
| | | </div> |
| | | </div> |
| | | <div class="mt10 w100" v-show="finalSampleList?.length == 0"><el-empty description="暂无数据" /></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="state.activeName == 3"> |
| | | <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> |
| | | </div> |
| | | <div class="mt10 w100 relative h100" v-show="state.knowledgeBaseList.length > 0"> |
| | | <div class="set_custom_label"> |
| | | <div class="chanel-tags"> |
| | | <div |
| | | v-for="(item, index) in state.knowledgeBaseList" |
| | | :key="index" |
| | | :class="{ 'set-group-label-active': state.activeKnowledgeName === item.group_id }" |
| | | class="flex items-center" |
| | | @click="handleKnowledgeClick(item)" |
| | | > |
| | | <span class="set-group-name">{{ item.group_name }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div |
| | | class="overflow-hidden min-h-[38px] transition-[max-height 0.2s] w100 flex flex-wrap text-xs leading-[14px] items-center" |
| | | > |
| | | <div |
| | | v-for="(itemChildren, index) in state.customKnowledgeChildList" |
| | | :key="index" |
| | | :class="{ 'set-label-active': state.activeKnowledgeChildName === itemChildren.group_id }" |
| | | @click="handleKnowledgeChildClick(itemChildren)" |
| | | class="cursor-pointer m-[5px] py-[5px] pl-[10px] text-[#999] transition-[background-color .1s, color .1s, border-color .1s]" |
| | | > |
| | | {{ itemChildren.group_name }} |
| | | </div> |
| | | </div> |
| | | <div class="mt10 w100 overflow-auto set-height-custom" v-show="finalKnowledgeList.length > 0"> |
| | | <div class="w100 pb-[20px]" v-for="item in finalKnowledgeList" :key="item.sample_id"> |
| | | <div |
| | | class="cursor-pointer flex box-border p-[12px] w100 rounded bg-[#f5f7fd] transition-[background-color .2s]" |
| | | @click="changeExample(item)" |
| | | > |
| | | <i |
| | | class="myiconfont icon-chazhaobiaodanliebiao pl-[2px] w-[16px] h-[16px] font12 text-[#fff] transform-[scale(.85)] rounded-[50%]" |
| | | :style="`background-color:${item.BgColor}`" |
| | | ></i> |
| | | <div class="ml-6 flex-1 min-w-0"> |
| | | <div class="text-sm text-[#000] m-0 p-0 font-bold">{{ item.sample_title }}</div> |
| | | <div class="mt-[6px] text-[13px] text-[#666] h-[20px] whitespace-nowrap text-ellipsis overflow-hidden"> |
| | | {{ item.sample_question }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="mt10 w100" v-show="finalKnowledgeList.length == 0"><el-empty description="暂无数据" /></div> |
| | | </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 { activeRoomId, activeSampleId, activeSectionAId, sectionAList, setRoomConfig } from '/@/stores/chatRoom'; |
| | | import { convertListToTree, debounce } from '/@/utils/util'; |
| | | import { OptClassificationMap, classificationEnum } from '/@/views/types/processDrawing/index'; |
| | | import { |
| | | activeGroupType, |
| | | activeRoomId, |
| | | activeSampleId, |
| | | activeSectionAId, |
| | | exampleSceneList, |
| | | isSharePage, |
| | | sceneGroupList, |
| | | setRoomConfig, |
| | | } from '/@/stores/chatRoom'; |
| | | import { convertListToTree } from '/@/utils/util'; |
| | | import { groupBy } from 'lodash-es'; |
| | | let state = reactive({ |
| | | tabNameList: [ |
| | | { ID: 1, Name: '业务场景' }, |
| | | { ID: 2, Name: '办公助手' }, |
| | | { ID: 3, Name: '知识库' }, |
| | | ], |
| | | activeName: 1, |
| | | activeBusinessName: '', //场景 |
| | | activeBusinessChildName: '', |
| | | customBusinessList: [], |
| | |
| | | exampleRandomContent: [], |
| | | exampleContent: [], |
| | | listSampleLoading: false, |
| | | listInstructLoading: false, |
| | | listSampleExpand: false, |
| | | listInstructExpand: false, |
| | | sampleMap: {}, |
| | | }); |
| | | |
| | | //#region ====================== 传参 ====================== |
| | | const isShow = defineModel('isShow', { |
| | | type: Boolean, |
| | |
| | | const rightBox = computed(() => (isShow.value ? 354 : 0)); |
| | | const emit = defineEmits(['updateChatInput']); |
| | | //#endregion |
| | | //#region ====================== 业务场景/办公助手/知识库的list ====================== |
| | | const instructContentList = ref([]); //指令列表 |
| | | 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; |
| | | }; |
| | | //随机生成颜色 |
| | | const randomHexColor = () => { |
| | | return `#${Math.floor(Math.random() * 16777215) |
| | | .toString(16) |
| | | .padEnd(6, '0')}`; |
| | | }; |
| | | //#region ====================== 业务场景/知识库的list ====================== |
| | | const loadingData = ref(false); |
| | | const changeExample = (item) => { |
| | | emit('updateChatInput', item.sample_question); |
| | | setRoomConfig(activeRoomId.value, 'isAnswerByLLM', false); |
| | | activeSampleId.value = item.sample_id; |
| | | activeSectionAId.value = item.group_id; |
| | | }; |
| | | //获取用户模板 |
| | | const getUserTemplate = async () => { |
| | | state.listInstructLoading = true; |
| | | const res = await getUserTemplateList().finally(() => { |
| | | state.listInstructLoading = false; |
| | | }); |
| | | instructContentList.value = res.templates; |
| | | //#endregion |
| | | //#region ====================== 办公助手使用 ====================== |
| | | const templateUseClick = (row) => { |
| | | state.useInstructDialog = true; |
| | | state.instructInfo = row; |
| | | state.inputInstruct = row.sample_question; |
| | | }; |
| | | const submitInstruct = () => { |
| | | setRoomConfig(activeRoomId.value, 'isAnswerByLLM', true); |
| | | emit('updateChatInput', state.inputInstruct); |
| | | handleClose(); |
| | | }; |
| | | //#endregion |
| | | //#region ====================== 默认选择第一个的场景的子场景 ====================== |
| | | //tags标签切换 |
| | | const handleTabClick = async (item) => { |
| | | state.activeName = item.ID; |
| | | if (state.activeName == 2) { |
| | | if (state.listInstructExpand) return; |
| | | await getUserTemplate(); |
| | | state.listInstructExpand = true; |
| | | } |
| | | tagListClick(sectionAList.value); |
| | | }; |
| | | //场景子场景 |
| | | const handleBusinessClick = (item) => { |
| | | state.activeBusinessName = item.group_id; |
| | | state.customBusinessChildList = item.Children; |
| | | if (item.Children.length > 0) { |
| | | state.activeBusinessChildName = item.Children[0].group_id ?? ''; |
| | | } else { |
| | | state.activeBusinessChildName = ''; |
| | | state.customBusinessChildList = []; |
| | | } |
| | | }; |
| | | const handleLabelChildClick = (item) => { |
| | | state.activeBusinessChildName = item.group_id; |
| | | }; |
| | | //办公子场景 |
| | | const handleOfficeClick = (item) => { |
| | | state.activeOfficeName = item.group_id; |
| | | state.customOfficeChildList = item.Children; |
| | | if (item.Children.length > 0) { |
| | | state.activeOfficeChildName = item.Children[0].group_id ?? ''; |
| | | } else { |
| | | state.activeOfficeChildName = ''; |
| | | state.customOfficeChildList = []; |
| | | } |
| | | }; |
| | | const handleOfficeChildClick = (item) => { |
| | | state.activeOfficeChildName = item.group_id; |
| | | }; |
| | | //知识库子场景 |
| | | const handleKnowledgeClick = (item) => { |
| | | state.activeKnowledgeName = item.group_id; |
| | | state.customKnowledgeChildList = item.Children; |
| | | if (item.Children.length > 0) { |
| | | state.activeKnowledgeChildName = item.Children[0].group_id ?? ''; |
| | | } else { |
| | | state.activeKnowledgeChildName = ''; |
| | | state.customKnowledgeChildList = []; |
| | | } |
| | | }; |
| | | const handleKnowledgeChildClick = (item) => { |
| | | state.activeKnowledgeChildName = item.group_id; |
| | | }; |
| | | //#endregion |
| | | //#region ====================== 打开示例 ====================== |
| | | //打开高级示例 |
| | | const toggleShow = async () => { |
| | | isShow.value = !isShow.value; |
| | |
| | | const handleCloseTemplate = () => { |
| | | isShow.value = false; |
| | | }; |
| | | //获取主场景列表 |
| | | const getMainSectionList = async () => { |
| | | const res = await getSectionList(); |
| | | const iconList = [ |
| | | 'biaodan', |
| | | 'putong', |
| | | 'zhongduancanshuchaxun', |
| | | 'shidu', |
| | | 'fuwenbenkuang', |
| | | 'fuwenben', |
| | | 'jiliandongxuanzeqi', |
| | | 'jinridaiban', |
| | | 'gongju', |
| | | ]; |
| | | res.groups.forEach((sectionItem, index) => { |
| | | sectionItem.Icon = iconList[index]; |
| | | }); |
| | | sectionAList.value = res.groups; |
| | | tagListClick(sectionAList.value); |
| | | }; |
| | | const loadingData = ref(false); |
| | | const getTableData = async () => { |
| | | if (!isShow.value) { |
| | | loadingData.value = true; |
| | | await getMainSectionList().finally(() => { |
| | | loadingData.value = false; |
| | | }); |
| | | if (state.activeName == 1 || state.activeName == 3) { |
| | | if (state.listSampleExpand) return; |
| | | await getSelectListSample(); |
| | | state.listSampleExpand = true; |
| | | } |
| | | } |
| | | }; |
| | | |
| | | //#region ====================== templateUseClick ====================== |
| | | const templateUseClick = (row) => { |
| | | state.useInstructDialog = true; |
| | | state.instructInfo = row; |
| | | state.inputInstruct = row.template_value; |
| | | }; |
| | | const handleClose = () => { |
| | | state.useInstructDialog = false; |
| | | }; |
| | | const submitInstruct = () => { |
| | | setRoomConfig(activeRoomId.value, 'isAnswerByLLM', true); |
| | | emit('updateChatInput', state.inputInstruct); |
| | | handleClose(); |
| | | }; |
| | | //#endregion |
| | | //#region ====================== 搜索场景/办公/知识库 ====================== |
| | | const queryParams = ref({ |
| | | sample_title: '', |
| | | }); |
| | | const { query: querySample, queryData: showSampleList } = useSearch(exampleList, queryParams); |
| | | const debounceQuery = debounce(querySample); |
| | | const finalSampleList = computed(() => { |
| | | const result = showSampleList.value.filter((item) => item.group_id == state.activeBusinessChildName); |
| | | return result ?? []; |
| | | }); |
| | | watch( |
| | | () => queryParams.value.sample_title, |
| | | (val) => { |
| | | debounceQuery(); |
| | | } |
| | | ); |
| | | //办公 |
| | | const officeParams = ref({ |
| | | template_title: '', |
| | | }); |
| | | const { query: queryInstruct, queryData: showInstructList } = useSearch(instructContentList, officeParams); |
| | | const finalOfficeList = computed(() => { |
| | | const result = showInstructList.value.filter((item) => item.template_group == state.activeOfficeChildName); |
| | | return result ?? []; |
| | | }); |
| | | const instructQuery = debounce(queryInstruct); |
| | | |
| | | watch( |
| | | () => officeParams.value.template_title, |
| | | (val) => { |
| | | instructQuery(); |
| | | } |
| | | ); |
| | | //知识库 |
| | | const knowledgeParams = ref({ |
| | | template_title: '', |
| | | }); |
| | | const { query: queryKnowledge, queryData: showKnowledgeList } = useSearch(exampleList, knowledgeParams); |
| | | const finalKnowledgeList = computed(() => { |
| | | const result = showKnowledgeList.value.filter((item) => item.group_id == state.activeKnowledgeChildName); |
| | | return result ?? []; |
| | | }); |
| | | const knowledgeQuery = debounce(queryKnowledge); |
| | | |
| | | watch( |
| | | () => officeParams.value.template_title, |
| | | (val) => { |
| | | knowledgeQuery(); |
| | | } |
| | | ); |
| | | //#endregion |
| | | |
| | | //#region ====================== 获取tag ====================== |
| | | |
| | | const tagListClick = (val) => { |
| | | if (val.length > 0) { |
| | | const selectTagList = []; |
| | | const officeList = []; |
| | | const businessList = []; |
| | | val.forEach((item) => { |
| | | if (item.group_type == OptClassificationMap[classificationEnum.Business]) { |
| | | businessList.push(item); |
| | | } else if (item.group_type == OptClassificationMap[classificationEnum.Knowledge]) { |
| | | selectTagList.push(item); |
| | | } else if ( |
| | | item.group_type != OptClassificationMap[classificationEnum.Business] && |
| | | item.group_type != OptClassificationMap[classificationEnum.Knowledge] |
| | | ) { |
| | | officeList.push(item); |
| | | } |
| | | }); |
| | | switch (state.activeName) { |
| | | case 1: |
| | | const treeBusinessList = convertListToTree(businessList, { |
| | | ID: 'group_id', |
| | | Children: 'Children', |
| | | ParentID: 'p_group_id', |
| | | }); |
| | | state.customBusinessList = treeBusinessList; //业务场景数据源 |
| | | state.activeBusinessName = treeBusinessList[0].group_id; //默认选中第一个业务场景 |
| | | state.customBusinessChildList = treeBusinessList[0].Children; //默认选中第一个业务场景的第一个子场景的数据源 |
| | | state.activeBusinessChildName = treeBusinessList[0].Children[0].group_id; |
| | | break; |
| | | case 2: |
| | | const treeOfficeList = convertListToTree(officeList, { |
| | | ID: 'group_id', |
| | | Children: 'Children', |
| | | ParentID: 'p_group_id', |
| | | }); |
| | | state.customOfficeList = treeOfficeList; //办公助手数据源 |
| | | state.activeOfficeName = treeOfficeList[0].group_id; //默认选中第一个办公助手 |
| | | state.customOfficeChildList = treeOfficeList[0].Children; //默认选中第一个办公助手的第一个子场景的数据源 |
| | | state.activeOfficeChildName = treeOfficeList[0].Children[0].group_id; //默认选中第一个办公助手的第一个子场景 |
| | | break; |
| | | case 3: |
| | | const treeTagList = convertListToTree(selectTagList, { |
| | | ID: 'group_id', |
| | | Children: 'Children', |
| | | ParentID: 'p_group_id', |
| | | }); |
| | | state.knowledgeBaseList = treeTagList; //知识库数据源 |
| | | state.activeKnowledgeName = treeTagList[0].group_id; //默认选中第一个知识库 |
| | | state.customKnowledgeChildList = treeTagList[0].Children; //默认选中第一个知识库的第一个子场景的数据源 |
| | | state.activeKnowledgeChildName = treeTagList[0].Children[0].group_id; //默认选中第一个知识库的第一个子场景 |
| | | break; |
| | | } |
| | | const handleBusinessClick = (item) => { |
| | | activeMainScene.value[activeGroupType.value] = item.group_id; |
| | | state.customBusinessChildList = item.children; |
| | | state.activeBusinessChildName = item.children[0]?.group_id; |
| | | if (!state.activeBusinessChildName) { |
| | | finalSampleList.value = []; |
| | | } else { |
| | | state.customBusinessList = []; |
| | | state.customBusinessChildList = []; |
| | | state.customOfficeChildList = []; |
| | | state.customKnowledgeChildList = []; |
| | | state.activeBusinessName = ''; |
| | | state.activeBusinessChildName = ''; |
| | | state.activeOfficeName = ''; |
| | | state.activeOfficeChildName = ''; |
| | | state.activeKnowledgeName = ''; |
| | | state.activeKnowledgeChildName = ''; |
| | | state.customOfficeList = []; |
| | | state.knowledgeBaseList = []; |
| | | finalSampleList.value = searchFilterSampleList(state.sampleMap[state.activeBusinessChildName]); |
| | | } |
| | | }; |
| | | const handleLabelChildClick = (item) => { |
| | | state.activeBusinessChildName = item.group_id; |
| | | finalSampleList.value = searchFilterSampleList(state.sampleMap[state.activeBusinessChildName]); |
| | | }; |
| | | //#endregion |
| | | //#region ====================== 默认选择第一个的场景的子场景 ====================== |
| | | const allData = ref({}); |
| | | const activeMainScene = ref({}); |
| | | const activeSubScene = ref({}); |
| | | const allSubScene = ref([]); |
| | | const searchValue = ref(''); |
| | | const finalSampleList = ref([]); //搜索过滤后的示例列表 |
| | | const getTableData = async () => { |
| | | const res = await sceneGroupList.value; |
| | | let groupDataByType = groupBy(res ?? [], (item) => item.group_type); |
| | | for (const key in groupDataByType) { |
| | | if (Object.prototype.hasOwnProperty.call(groupDataByType, key)) { |
| | | const value = groupDataByType[key]; |
| | | const newValue = convertListToTree(value ?? [], { |
| | | ID: 'group_id', |
| | | ParentID: 'p_group_id', |
| | | Children: 'children', |
| | | }); |
| | | groupDataByType[key] = newValue; |
| | | } |
| | | } |
| | | const keys = Object.keys(groupDataByType); |
| | | if (keys.includes('业务场景')) { |
| | | const value = groupDataByType['业务场景']; |
| | | //有业务场景,业务场景放第一 |
| | | groupDataByType = { |
| | | 业务场景: value, |
| | | ...groupDataByType, |
| | | }; |
| | | } |
| | | allData.value = groupDataByType; |
| | | const typeArr = Object.keys(allData.value); |
| | | let subSceneList = []; |
| | | |
| | | if (activeGroupType.value) { |
| | | // 初始化激活 mainScene |
| | | activeMainScene.value = typeArr.reduce((preVal, curVal) => { |
| | | const mainSceneList = allData.value[curVal]; |
| | | // 设置第一个激活 |
| | | preVal[curVal] = mainSceneList?.[0]?.group_id; |
| | | // 初始化激活 subScene |
| | | mainSceneList.map((item, index, array) => { |
| | | if (item.children) { |
| | | subSceneList = subSceneList.concat(item.children); |
| | | } |
| | | // 设置第一个激活 |
| | | activeSubScene.value[item.group_id] = array[index].children?.[0]?.group_id; |
| | | }); |
| | | return preVal; |
| | | }, {}); |
| | | } |
| | | allSubScene.value = subSceneList; |
| | | const activeMainSceneData = allData.value[activeGroupType.value]; |
| | | const activeMainSceneId = activeMainScene.value[activeGroupType.value]; |
| | | state.activeBusinessChildName = activeSubScene.value[activeMainSceneId]; //初始化业务场景的子场景默认值 |
| | | state.customBusinessChildList = activeMainSceneData.filter((item) => item.group_id === activeMainSceneId)[0].children; |
| | | state.sampleMap = displaySampleMap(); |
| | | finalSampleList.value = searchFilterSampleList(state.sampleMap[state.activeBusinessChildName]); |
| | | }; |
| | | const displaySampleMap = () => { |
| | | const sampleMap = {}; |
| | | allSubScene.value.map(async (item) => { |
| | | const groupId = item.group_id; |
| | | sampleMap[groupId] = exampleSceneList.value.filter((item) => item.group_id === groupId); |
| | | }); |
| | | return sampleMap; |
| | | }; |
| | | |
| | | const searchFilterSampleList = (sampleList: any[]) => { |
| | | if (!searchValue.value) return sampleList; |
| | | const checkKey = ['sample_question', 'sample_title']; |
| | | const filterList = sampleList.filter((item) => { |
| | | return checkKey.some((subItem) => item[subItem].toLowerCase().trim().includes(searchValue.value.toLowerCase().trim())); |
| | | }); |
| | | return filterList; |
| | | }; |
| | | watch(activeGroupType, () => { |
| | | getTableData(); |
| | | }); |
| | | watch(searchValue, () => { |
| | | finalSampleList.value = searchFilterSampleList(state.sampleMap[state.activeBusinessChildName]); |
| | | }); |
| | | //#endregion |
| | | defineExpose({ getTableData }); |
| | | </script> |
| | | <style scoped lang="scss"> |
| | |
| | | .set-group-name { |
| | | margin: 0px 7px; |
| | | white-space: nowrap; |
| | | border: 1px solid #999; |
| | | border-radius: 0.75rem; |
| | | padding: 0 6px; |
| | | line-height: 22px; |
| | | // border: 1px solid #999; |
| | | // border-radius: 0.75rem; |
| | | // padding: 0 6px; |
| | | // line-height: 22px; |
| | | } |
| | | } |
| | | } |
| | |
| | | max-height: 180px; |
| | | } |
| | | .set-group-label-active { |
| | | border-color: #161616; |
| | | color: #000; |
| | | } |
| | | .set-label-active { |