diff --git a/src/routes/setting/skillManagement/getSkillList.ts b/src/routes/setting/skillManagement/getSkillList.ts index 7a19513..168e60f 100644 --- a/src/routes/setting/skillManagement/getSkillList.ts +++ b/src/routes/setting/skillManagement/getSkillList.ts @@ -28,43 +28,55 @@ export default router.post( if (search) { const searchPattern = `%${search}%`; const whereBuilder = (builder: any) => { - builder.where("name", "like", searchPattern).orWhere("path", "like", searchPattern).orWhere("description", "like", searchPattern); + builder + .where("name", "like", searchPattern) + .orWhere("path", "like", searchPattern) + .orWhere("description", "like", searchPattern); }; query = query.where(whereBuilder); countQuery = countQuery.where(whereBuilder); } - // 查询总数 - const [{ count }]: any = await countQuery.count("* as count"); - - // 查询列表 + // type 筛选条件 if (type) { query = query.where("type", type); countQuery = countQuery.where("type", type); } + + // attributions 筛选条件 if (attributions && attributions.length > 0) { - query = query.whereIn("id", function () { - this.select("skillId").from("o_skillAttribution").whereIn("attribution", attributions); - }); - countQuery = countQuery.whereIn("id", function () { - this.select("skillId").from("o_skillAttribution").whereIn("attribution", attributions); - }); + const attributionSubQuery = function (this: any) { + this.select("skillId") + .from("o_skillAttribution") + .whereIn("attribution", attributions); + }; + query = query.whereIn("id", attributionSubQuery); + countQuery = countQuery.whereIn("id", attributionSubQuery); } + // 查询总数(在所有筛选条件应用后) + const [{ count }]: any = await countQuery.count("* as count"); + + // 查询列表 const list = await query .select("*") - .orderByRaw(` + .orderByRaw( + ` CASE type WHEN 'main' THEN 1 ELSE 0 END ASC, CASE WHEN id NOT IN (SELECT skillId FROM o_skillAttribution) THEN 0 ELSE 1 END ASC, CASE WHEN state = 1 THEN 1 ELSE 0 END ASC, updateTime DESC - `) + ` + ) .limit(limit) .offset(offset); // 查询每个技能的归属 const skillIds = list.map((item: any) => item.id); - const attributionsList = await u.db("o_skillAttribution").whereIn("skillId", skillIds).select("skillId", "attribution"); + const attributionsList = await u + .db("o_skillAttribution") + .whereIn("skillId", skillIds) + .select("skillId", "attribution"); // 将归属信息合并到列表中 const attributionMap = new Map(); @@ -75,6 +87,9 @@ export default router.post( attributionMap.get(attr.skillId!)!.push(attr.attribution!); } + // 记录需要更新state的技能id + const missingFileIds: string[] = []; + const listWithAttributions = list.map((item: any) => { const normalizedPath = (item.path || "").replace(/\\/g, "/"); const isPrefixedReferencePath = normalizedPath.startsWith("references/"); @@ -83,19 +98,41 @@ export default router.post( ? path.join(u.getPath(["skills", "references"]), item.path!) : path.join(u.getPath("skills"), item.path!); + let content = ""; + let state = item.state; + + // 检查文件是否存在 + if (fs.existsSync(skillFilePath)) { + content = fs.readFileSync(skillFilePath, "utf-8"); + } else { + state = -1; + if (item.state !== -1) { + missingFileIds.push(item.id); + } + } + return { ...item, + state, attributions: attributionMap.get(item.id) || [], - content: fs.readFileSync(skillFilePath, "utf-8"), + content, embedding: item.embedding ? true : false, }; }); + // 批量更新文件不存在的技能状态 + if (missingFileIds.length > 0) { + await u + .db("o_skillList") + .whereIn("id", missingFileIds) + .update({ state: -1 }); + } + res.status(200).send( success({ list: listWithAttributions, total: Number(count), - }), + }) ); - }, -); + } +); \ No newline at end of file diff --git a/src/types/database.d.ts b/src/types/database.d.ts index 3e58c97..70b079c 100644 --- a/src/types/database.d.ts +++ b/src/types/database.d.ts @@ -1,25 +1,6 @@ -// @db-hash ce28b6d566911952421c2661e14bfde5 +// @db-hash d807205fbb27fc5ddb04cae060fb4430 //该文件由脚本自动生成,请勿手动修改 -export interface _o_storyboard_old_20260325 { - 'camera'?: string | null; - 'createTime'?: number | null; - 'description'?: string | null; - 'duration'?: string | null; - 'filePath'?: string | null; - 'frameMode'?: string | null; - 'id'?: number; - 'lines'?: string | null; - 'mode'?: string | null; - 'model'?: string | null; - 'prompt'?: string | null; - 'reason'?: string | null; - 'resolution'?: string | null; - 'scriptId'?: number | null; - 'sound'?: string | null; - 'state'?: string | null; - 'title'?: string | null; -} export interface memories { 'content': string; 'createTime': number; @@ -127,11 +108,13 @@ export interface o_project { 'artStyle'?: string | null; 'createTime'?: number | null; 'id'?: number | null; + 'imageModel'?: string | null; 'intro'?: string | null; 'name'?: string | null; 'projectType'?: string | null; 'type'?: string | null; 'userId'?: number | null; + 'videoModel'?: string | null; 'videoRatio'?: string | null; } export interface o_script { @@ -237,7 +220,6 @@ export interface o_videoConfig { } export interface DB { - "_o_storyboard_old_20260325": _o_storyboard_old_20260325; "memories": memories; "o_agentDeploy": o_agentDeploy; "o_agentWorkData": o_agentWorkData;