wujingjing
2025-03-14 4e57cc40899cb6dcaeec1eda0a2325a74e44f9db
src/stores/chatRoom.ts
@@ -1,6 +1,15 @@
import { computed, ref } from 'vue';
import { getSectionList } from '../api/ai/chat';
import { CreateHistoryGroup, GetHistoryGroups, getSectionList, getSelectSample, getUserTemplateList } from '../api/ai/chat';
import { PostLogin } from '../api/ai/user';
import { PingLogin } from '../api/system';
import { LOGIN_CLIENT, STORED_ACCOUNT_KEY, handleAfterLogin } from '../layout/component/login/login';
import type { ChatRoomItem } from '../layout/component/sidebar/components/types';
import { router } from '../router';
import { decrypt } from '../utils/cypto';
import emitter from '../utils/mitt';
import { gotoRoute } from '../utils/route';
import { Local, LocalPlus } from '../utils/storage';
import { getCurrentPosition } from '../utils/brower';
/**
 * Room 关联的一些配置
@@ -56,7 +65,7 @@
/** @description 当前聊天室 groupType */
export const activeGroupType = computed({
   get: () => {
      const result = getRoomConfig(activeRoomId.value, 'activeGroupType') ?? '业务场景';
      const result = getRoomConfig(activeRoomId.value, 'activeGroupType') ?? groupTypeList.value.at(-1);
      return result;
   },
   set: (value) => {
@@ -68,9 +77,11 @@
 * 全局使用的 ref
 */
export const sectionAList = ref([]);
export const isShowLogin = ref(false);
export const isLoginStatus = ref(false);
//#region ====================== 全局使用数据 ======================
// group 列表
// 主场景 列表
export const sceneGroupList = ref([]);
// groupType 列表
export const groupTypeList = computed(() => Array.from(new Set(sceneGroupList.value.map((item) => item.group_type))));
@@ -82,16 +93,196 @@
   知识库: 'ywicon-changyonggongjuzhishisuoyin',
   业务场景: 'ywicon-yewu',
};
//获取场景选择列表
const getSceneGroupList = async () => {
   const res = await getSectionList();
   sceneGroupList.value = res?.groups ?? [];
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 () => {
   getSceneGroupList();
   Promise.allSettled([getSectionList(), getSelectSample({}), getUserTemplateList()])
      .then((res) => {
         const [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);
      }
   });
};
export const pingLogin = async () => {
   // 5分钟
   const interval = 1000 * 60 * 5;
   // const interval = 1000 *2;
   const timer = setInterval(async () => {
      const res = await PingLogin();
      if (!res?.is_login) {
         clearInterval(timer);
      }
   }, interval);
   return timer;
};
/**
 * 自动登录,从本地获取登录信息
 * @returns
 */
export const autoLogin = async () => {
   const account = LocalPlus.get(STORED_ACCOUNT_KEY);
   if (!account) return;
   const accountInfo = decrypt(account);
   if (!accountInfo) return;
   const res: any = await PostLogin({
      user: accountInfo.username,
      pass: accountInfo.password,
      client: LOGIN_CLIENT,
   });
   if (!res.json_ok || !res.hswatersession) {
      return;
   }
   handleAfterLogin(res);
};
export const currentPosition = ref<Position>(null);
export const getGlobalPosition = () => {
   getCurrentPosition();
   setInterval(() => {
      getCurrentPosition();
   }, 1000 * 60 * 60);
};