workspace.ts 3.94 KB
import { defineStore } from "pinia";
import { ref } from "vue";
import { ElMessage } from "element-plus";
import {
  apiCreateDraftFromQuestion,
  apiCreateDraftFromDeepSearch,
  apiSaveDraftToKnowledge,
} from "@/api/drafts";
import { getFiles, createFolder } from "@/api/files";
import { useAppStore } from "@/stores/app";

export const useWorkspaceStore = defineStore("workspace", () => {
  const isDocumentGenerating = ref(false);
  const generatingProgress = ref(0);
  const currentGeneratingTitle = ref("");

  async function generateDocument(params: {
    title: string;
    content: string;
    questionId?: string;
    isDeepSearch?: boolean;
    onSuccess?: (fileInfo: any, draftContent: string) => void;
  }) {
    if (isDocumentGenerating.value) {
      ElMessage.warning("已有文档正在生成中,请稍后再试");
      return;
    }

    try {
      isDocumentGenerating.value = true;
      generatingProgress.value = 10;
      currentGeneratingTitle.value = params.title;

      let title = params.title.replace(/\n/g, " ").substring(0, 20).trim();
      if (!title) title = "未命名文档";

      // 1. 检查并创建“草稿”目录
      generatingProgress.value = 30;
      let draftFolderId: number | undefined;
      const rootFilesRes = await getFiles();
      if (rootFilesRes.status === 200 && rootFilesRes.data) {
        const items = Array.isArray(rootFilesRes.data)
          ? rootFilesRes.data
          : (rootFilesRes.data.items || []);
        const draftFolder = items.find(
          (item: any) =>
            (item.type === "folder" || item.isFolder) && item.name === "草稿",
        );
        if (draftFolder) {
          draftFolderId = draftFolder.id;
        }
      }

      if (!draftFolderId) {
        const createFolderRes = await createFolder({ name: "草稿" });
        if (createFolderRes.status === 200 && createFolderRes.data) {
          draftFolderId = createFolderRes.data.id;
        }
      }

      // 2. 调用保存API创建草稿
      generatingProgress.value = 60;
      let response;
      if (params.isDeepSearch) {
        response = await apiCreateDraftFromDeepSearch({
          title,
          content: params.content,
        });
      } else if (params.questionId) {
        response = await apiCreateDraftFromQuestion(params.questionId, {
          title,
        });
      } else {
        throw new Error("缺少问题ID或内容");
      }

      if (response.status === 200 && response.data) {
        const draftInfo = response.data;
        const draftContent = draftInfo.content || "";

        // 3. 将草稿保存到“草稿”目录
        generatingProgress.value = 80;
        const saveRes = await apiSaveDraftToKnowledge(draftInfo.id, {
          parentId: draftFolderId,
          fileName: title + ".md",
        });

        if (saveRes.status === 200 && saveRes.data) {
          const fileInfo = saveRes.data;
          generatingProgress.value = 100;

          // 刷新文件列表
          const appStore = useAppStore();
          appStore.triggerRefreshFileHierarchy(draftFolderId);
          window.dispatchEvent(
            new CustomEvent("refresh-file-hierarchy", {
              detail: { folderId: draftFolderId },
            }),
          );

          if (params.onSuccess) {
            params.onSuccess(fileInfo, draftContent);
          }
          
          ElMessage.success("已保存到草稿目录");
        } else {
          throw new Error("保存到目录失败");
        }
      } else {
        throw new Error((response as any)?.data?.message || "创建草稿失败");
      }
    } catch (error: any) {
      console.error("生成文档失败:", error);
      ElMessage.error(error.message || "操作失败,请重试");
    } finally {
      isDocumentGenerating.value = false;
      generatingProgress.value = 0;
      currentGeneratingTitle.value = "";
    }
  }

  return {
    isDocumentGenerating,
    generatingProgress,
    currentGeneratingTitle,
    generateDocument,
  };
});