| | |
| | | import { computed, ref, watch } from 'vue'; |
| | | import type { ChatRoomItem } from '../layout/component/sidebar/waterLeftAside/types'; |
| | | import { reject } from 'lodash-es'; |
| | | import { computed, ref } from 'vue'; |
| | | import { CreateHistoryGroup, GetHistoryGroups, getSectionList, getSelectSample, getUserTemplateList } from '../api/ai/chat'; |
| | | import type { ChatRoomItem } from '../layout/component/sidebar/components/types'; |
| | | import { router } from '../router'; |
| | | import emitter from '../utils/mitt'; |
| | | import { gotoRoute } from '../utils/route'; |
| | | import { Local } from '../utils/storage'; |
| | | |
| | | /** |
| | | * Room 关联的一些配置 |
| | | */ |
| | | export type RoomConfig = { |
| | | /** 是否直接调用大模型(通义千问)回答 */ |
| | | isAnswerByLLM: boolean; |
| | | /** @description 从首页进去获取的第一个回复,回调函数 */ |
| | | firstResCb: any; |
| | | /** @description 当前聊天室的 group_type */ |
| | | activeGroupType: string; |
| | | }; |
| | | |
| | | export type RoomConfigKey = keyof RoomConfig; |
| | | export const roomConfig = ref<Record<string, RoomConfig>>(null); |
| | | |
| | | export const setRoomConfig = <T extends RoomConfigKey>(roomId: string, key: T, value: RoomConfig[T]) => { |
| | | if (!roomId) return; |
| | | if (!roomConfig.value) { |
| | | roomConfig.value = {}; |
| | | } |
| | | if (!roomConfig.value[roomId]) { |
| | | roomConfig.value[roomId] = { |
| | | [key]: value, |
| | | } as any; |
| | | } else { |
| | | roomConfig.value[roomId][key] = value; |
| | | } |
| | | }; |
| | | |
| | | export const getRoomConfig = <T extends RoomConfigKey>(roomId: string, key: T) => { |
| | | if (!roomId) return; |
| | | if (!roomConfig.value) { |
| | | return null; |
| | | } |
| | | if (!roomConfig.value[roomId]) { |
| | | return null; |
| | | } else { |
| | | return roomConfig.value[roomId][key]; |
| | | } |
| | | }; |
| | | |
| | | export const chatRoomList = ref<ChatRoomItem[]>([]); |
| | | |
| | | |
| | | |
| | | export const activeRoomId = ref(null); |
| | | export const activeChatRoom = computed(() => chatRoomList.value?.find((item) => item.id === activeRoomId.value)); |
| | | export const activeSampleId = ref(null); |
| | | export const activeSectionAId = ref(null); |
| | | export const topGroupId = ref(null); |
| | | |
| | | export const activeLLMId = ref(null); |
| | | |
| | | /** @description 当前聊天室 groupType */ |
| | | export const activeGroupType = computed({ |
| | | get: () => { |
| | | const result = getRoomConfig(activeRoomId.value, 'activeGroupType') ?? '业务场景'; |
| | | return result; |
| | | }, |
| | | set: (value) => { |
| | | setRoomConfig(activeRoomId.value, 'activeGroupType', value); |
| | | }, |
| | | }); |
| | | |
| | | /** |
| | | * 全局使用的 ref |
| | | */ |
| | | export const sectionAList = ref([]); |
| | | export const isShowLogin = ref(false); |
| | | export const isLoginStatus = ref(false); |
| | | |
| | | //#region ====================== 全局使用数据 ====================== |
| | | // 主场景 列表 |
| | | export const sceneGroupList = ref([]); |
| | | // groupType 列表 |
| | | export const groupTypeList = computed(() => Array.from(new Set(sceneGroupList.value.map((item) => item.group_type)))); |
| | | // 办公/模板 列表 |
| | | export const exampleSceneList = ref([]); |
| | | export const officeList = ref([]); |
| | | export const groupTypeMapIcon = { |
| | | 办公助手: 'ywicon-bangong', |
| | | 知识库: 'ywicon-changyonggongjuzhishisuoyin', |
| | | 业务场景: 'ywicon-yewu', |
| | | }; |
| | | const getSelectListSample = async (res1, res2) => { |
| | | try { |
| | | const samples = res1?.value?.samples ?? []; |
| | | const templateSamples = (res2?.value?.templates ?? []).map((item) => ({ |
| | | group_id: item.template_group, |
| | | sample_id: item.template_id, |
| | | sample_title: item.template_title, |
| | | sample_question: item.template_value, |
| | | template_create_time: item.create_time, |
| | | template_type: item.template_type, |
| | | isTemplate: true, |
| | | })); |
| | | exampleSceneList.value = samples |
| | | .concat(templateSamples) |
| | | .map((item) => ({ ...item, Icon: '/static/images/wave/ChatImg.png', BgColor: randomHexColor() })); |
| | | } catch (error) { |
| | | console.error('获取选择列表样本时出错:', error); |
| | | } |
| | | }; |
| | | //随机生成颜色 |
| | | const randomHexColor = () => { |
| | | return `#${Math.floor(Math.random() * 16777215) |
| | | .toString(16) |
| | | .padEnd(6, '0')}`; |
| | | }; |
| | | /** |
| | | * 获取全局所有数据 |
| | | */ |
| | | export const getAllData = async () => { |
| | | Promise.allSettled([getSectionList(), getSelectSample({}), getUserTemplateList()]) |
| | | .then((res) => { |
| | | let [sectionList, selectSample, userTemplateList] = res; |
| | | sceneGroupList.value = sectionList?.value?.groups ?? []; |
| | | getSelectListSample(selectSample, userTemplateList); |
| | | }) |
| | | .catch((err) => {}); |
| | | getHistoryChatRooms(); |
| | | }; |
| | | |
| | | //#endregion |
| | | /** @description 聊天室展示模式 */ |
| | | export type ChatMode = 'share' | 'default'; |
| | | |
| | | /** @description 聊天室展示模式 */ |
| | | // export const chatDisplayMode = ref<ChatMode>('default'); |
| | | |
| | | export const SHARE_PAGE_NAME = 'ShareAnswer'; |
| | | export const isSharePage = computed(() => { |
| | | const isShare = router.currentRoute.value.name === SHARE_PAGE_NAME; |
| | | return isShare; |
| | | }); |
| | | |
| | | export const newChatRoomClick = async () => { |
| | | const res = await CreateHistoryGroup({ |
| | | group_title: '新建对话开始', |
| | | }); |
| | | |
| | | const newRoom = { |
| | | id: res.history_group_id, |
| | | isInitial: true, |
| | | title: '新建对话开始', |
| | | }; |
| | | if (!chatRoomList.value) { |
| | | chatRoomList.value = [newRoom]; |
| | | } else { |
| | | chatRoomList.value.unshift(newRoom); |
| | | } |
| | | activeRoomId.value = newRoom.id; |
| | | |
| | | gotoAnswerPage(newRoom); |
| | | }; |
| | | export const gotoAnswerPage = (room: ChatRoomItem) => { |
| | | if (room.isInitial) { |
| | | gotoRoute({ |
| | | name: 'Home', |
| | | query: { |
| | | id: room.id, |
| | | }, |
| | | }); |
| | | } else { |
| | | gotoRoute({ |
| | | name: 'AskAnswer', |
| | | query: { |
| | | id: room.id, |
| | | }, |
| | | }); |
| | | } |
| | | setTimeout(() => { |
| | | emitter.emit('isShowHomePage', room.isInitial); |
| | | }, 300); |
| | | }; |
| | | |
| | | // 用户信息 |
| | | export const userInfo = { |
| | | get: () => { |
| | | return Local.get('userInfo'); |
| | | }, |
| | | set: (val) => { |
| | | return Local.set('userInfo', val); |
| | | }, |
| | | clear: () => { |
| | | Local.remove('userInfo'); |
| | | }, |
| | | get isNew() { |
| | | return !this.get()?.web_login; |
| | | }, |
| | | }; |
| | | |
| | | let getHistoryChatRoomsPromise: Promise<any>; |
| | | //历史对话 |
| | | const getHistoryChatRooms = async () => { |
| | | getHistoryChatRoomsPromise = new Promise(async (resolve, reject) => { |
| | | if (isSharePage.value) return resolve(null); |
| | | const res = await GetHistoryGroups(); |
| | | const resData = (res?.groups || []) as any[]; |
| | | // 按最晚时间到最早时间 |
| | | chatRoomList.value = resData |
| | | ?.toSorted((a, b) => { |
| | | return b.create_time.localeCompare(a.create_time); |
| | | }) |
| | | .map((item) => { |
| | | return { |
| | | id: item.group_id, |
| | | title: item.group_title, |
| | | createTime: item.create_time, |
| | | isInitial: Number(item.chat_count) === 0, |
| | | }; |
| | | }); |
| | | |
| | | resolve(chatRoomList.value); |
| | | }); |
| | | }; |
| | | |
| | | const roomClick = (room: ChatRoomItem) => { |
| | | activeRoomId.value = room.id; |
| | | |
| | | gotoAnswerPage(room); |
| | | }; |
| | | |
| | | export const selectFirstRoom = () => { |
| | | getHistoryChatRoomsPromise.then(() => { |
| | | if (!chatRoomList.value || chatRoomList.value.length === 0) { |
| | | newChatRoomClick(); |
| | | } else { |
| | | const toClickRoom = activeChatRoom.value ?? chatRoomList.value[0]; |
| | | roomClick(toClickRoom); |
| | | } |
| | | }); |
| | | }; |