# Conflicts:
#	src/router.ts
#	src/types/database.d.ts
This commit is contained in:
ACT丶流星雨 2026-03-24 09:50:35 +08:00
commit 6faa5c93d3
11 changed files with 231 additions and 110 deletions

View File

@ -204,6 +204,7 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
table.integer("projectId"); table.integer("projectId");
table.integer("eventState"); table.integer("eventState");
table.text("event"); table.text("event");
table.text("errorReason");
table.integer("createTime"); table.integer("createTime");
table.primary(["id"]); table.primary(["id"]);
table.unique(["id"]); table.unique(["id"]);
@ -447,6 +448,15 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
table.unique(["storyboardId", "assetId"]); table.unique(["storyboardId", "assetId"]);
}, },
}, },
{
name: "o_scriptAssets",
builder: (table) => {
table.integer("scriptId").notNullable();
table.integer("assetId").notNullable();
table.primary(["scriptId", "assetId"]);
table.unique(["scriptId", "assetId"]);
},
},
]; ];
for (const t of tables) { for (const t of tables) {

View File

@ -1,4 +1,4 @@
// @routes-hash 0ea539b96a91286c69cc811893902704 // @routes-hash d482a1b197a774825d3bc1c4ca8b70c5
import { Express } from "express"; import { Express } from "express";
import route1 from "./routes/agents/clearMemory"; import route1 from "./routes/agents/clearMemory";
@ -49,37 +49,38 @@ import route45 from "./routes/production/saveFlowData";
import route46 from "./routes/production/workbench/confirmSelection"; import route46 from "./routes/production/workbench/confirmSelection";
import route47 from "./routes/production/workbench/delVideo"; import route47 from "./routes/production/workbench/delVideo";
import route48 from "./routes/production/workbench/generateVideo"; import route48 from "./routes/production/workbench/generateVideo";
import route49 from "./routes/production/workbench/getVideoModelDetail"; import route49 from "./routes/production/workbench/getChatLines";
import route50 from "./routes/production/workbench/videoPolling"; import route50 from "./routes/production/workbench/getVideoModelDetail";
import route51 from "./routes/project/addProject"; import route51 from "./routes/production/workbench/videoPolling";
import route52 from "./routes/project/delProject"; import route52 from "./routes/project/addProject";
import route53 from "./routes/project/editProject"; import route53 from "./routes/project/delProject";
import route54 from "./routes/project/getProject"; import route54 from "./routes/project/editProject";
import route55 from "./routes/script/addScript"; import route55 from "./routes/project/getProject";
import route56 from "./routes/script/delScript"; import route56 from "./routes/script/addScript";
import route57 from "./routes/script/exportScript"; import route57 from "./routes/script/delScript";
import route58 from "./routes/script/getScrptApi"; import route58 from "./routes/script/exportScript";
import route59 from "./routes/script/updateScript"; import route59 from "./routes/script/getScrptApi";
import route60 from "./routes/scriptAgent/getPlanData"; import route60 from "./routes/script/updateScript";
import route61 from "./routes/scriptAgent/setPlanData"; import route61 from "./routes/scriptAgent/getPlanData";
import route62 from "./routes/setting/agentDeploy/deployAgentModel"; import route62 from "./routes/scriptAgent/setPlanData";
import route63 from "./routes/setting/agentDeploy/getAgentDeploy"; import route63 from "./routes/setting/agentDeploy/deployAgentModel";
import route64 from "./routes/setting/agentDeploy/updateKey"; import route64 from "./routes/setting/agentDeploy/getAgentDeploy";
import route65 from "./routes/setting/dbConfig/clearData"; import route65 from "./routes/setting/agentDeploy/updateKey";
import route66 from "./routes/setting/getTextModel"; import route66 from "./routes/setting/dbConfig/clearData";
import route67 from "./routes/setting/loginConfig/getUser"; import route67 from "./routes/setting/getTextModel";
import route68 from "./routes/setting/loginConfig/updateUserPwd"; import route68 from "./routes/setting/loginConfig/getUser";
import route69 from "./routes/setting/memoryConfig/getMemory"; import route69 from "./routes/setting/loginConfig/updateUserPwd";
import route70 from "./routes/setting/memoryConfig/sureMemory"; import route70 from "./routes/setting/memoryConfig/getMemory";
import route71 from "./routes/setting/vendorConfig/addVendor"; import route71 from "./routes/setting/memoryConfig/sureMemory";
import route72 from "./routes/setting/vendorConfig/deleteVendor"; import route72 from "./routes/setting/vendorConfig/addVendor";
import route73 from "./routes/setting/vendorConfig/getVendorList"; import route73 from "./routes/setting/vendorConfig/deleteVendor";
import route74 from "./routes/setting/vendorConfig/modelTest"; import route74 from "./routes/setting/vendorConfig/getVendorList";
import route75 from "./routes/setting/vendorConfig/updateVendor"; import route75 from "./routes/setting/vendorConfig/modelTest";
import route76 from "./routes/task/getTaskApi"; import route76 from "./routes/setting/vendorConfig/updateVendor";
import route77 from "./routes/task/getTaskCategories"; import route77 from "./routes/task/getTaskApi";
import route78 from "./routes/task/taskDetails"; import route78 from "./routes/task/getTaskCategories";
import route79 from "./routes/test/test"; import route79 from "./routes/task/taskDetails";
import route80 from "./routes/test/test";
export default async (app: Express) => { export default async (app: Express) => {
app.use("/api/agents/clearMemory", route1); app.use("/api/agents/clearMemory", route1);
@ -130,35 +131,36 @@ export default async (app: Express) => {
app.use("/api/production/workbench/confirmSelection", route46); app.use("/api/production/workbench/confirmSelection", route46);
app.use("/api/production/workbench/delVideo", route47); app.use("/api/production/workbench/delVideo", route47);
app.use("/api/production/workbench/generateVideo", route48); app.use("/api/production/workbench/generateVideo", route48);
app.use("/api/production/workbench/getVideoModelDetail", route49); app.use("/api/production/workbench/getChatLines", route49);
app.use("/api/production/workbench/videoPolling", route50); app.use("/api/production/workbench/getVideoModelDetail", route50);
app.use("/api/project/addProject", route51); app.use("/api/production/workbench/videoPolling", route51);
app.use("/api/project/delProject", route52); app.use("/api/project/addProject", route52);
app.use("/api/project/editProject", route53); app.use("/api/project/delProject", route53);
app.use("/api/project/getProject", route54); app.use("/api/project/editProject", route54);
app.use("/api/script/addScript", route55); app.use("/api/project/getProject", route55);
app.use("/api/script/delScript", route56); app.use("/api/script/addScript", route56);
app.use("/api/script/exportScript", route57); app.use("/api/script/delScript", route57);
app.use("/api/script/getScrptApi", route58); app.use("/api/script/exportScript", route58);
app.use("/api/script/updateScript", route59); app.use("/api/script/getScrptApi", route59);
app.use("/api/scriptAgent/getPlanData", route60); app.use("/api/script/updateScript", route60);
app.use("/api/scriptAgent/setPlanData", route61); app.use("/api/scriptAgent/getPlanData", route61);
app.use("/api/setting/agentDeploy/deployAgentModel", route62); app.use("/api/scriptAgent/setPlanData", route62);
app.use("/api/setting/agentDeploy/getAgentDeploy", route63); app.use("/api/setting/agentDeploy/deployAgentModel", route63);
app.use("/api/setting/agentDeploy/updateKey", route64); app.use("/api/setting/agentDeploy/getAgentDeploy", route64);
app.use("/api/setting/dbConfig/clearData", route65); app.use("/api/setting/agentDeploy/updateKey", route65);
app.use("/api/setting/getTextModel", route66); app.use("/api/setting/dbConfig/clearData", route66);
app.use("/api/setting/loginConfig/getUser", route67); app.use("/api/setting/getTextModel", route67);
app.use("/api/setting/loginConfig/updateUserPwd", route68); app.use("/api/setting/loginConfig/getUser", route68);
app.use("/api/setting/memoryConfig/getMemory", route69); app.use("/api/setting/loginConfig/updateUserPwd", route69);
app.use("/api/setting/memoryConfig/sureMemory", route70); app.use("/api/setting/memoryConfig/getMemory", route70);
app.use("/api/setting/vendorConfig/addVendor", route71); app.use("/api/setting/memoryConfig/sureMemory", route71);
app.use("/api/setting/vendorConfig/deleteVendor", route72); app.use("/api/setting/vendorConfig/addVendor", route72);
app.use("/api/setting/vendorConfig/getVendorList", route73); app.use("/api/setting/vendorConfig/deleteVendor", route73);
app.use("/api/setting/vendorConfig/modelTest", route74); app.use("/api/setting/vendorConfig/getVendorList", route74);
app.use("/api/setting/vendorConfig/updateVendor", route75); app.use("/api/setting/vendorConfig/modelTest", route75);
app.use("/api/task/getTaskApi", route76); app.use("/api/setting/vendorConfig/updateVendor", route76);
app.use("/api/task/getTaskCategories", route77); app.use("/api/task/getTaskApi", route77);
app.use("/api/task/taskDetails", route78); app.use("/api/task/getTaskCategories", route78);
app.use("/api/test/test", route79); app.use("/api/task/taskDetails", route79);
app.use("/api/test/test", route80);
} }

View File

@ -40,7 +40,7 @@ export default router.post(
await u await u
.db("o_novel") .db("o_novel")
.where("id", item.id) .where("id", item.id)
.update({ event: item.event, eventState: item.event ? 1 : -1 }); .update({ event: item.event, eventState: item.event ? 1 : -1, errorReason: item?.errReason ?? null });
}); });
novelClass.start(chapterAllList, projectId); novelClass.start(chapterAllList, projectId);

View File

@ -26,7 +26,7 @@ export default router.post(
await u await u
.db("o_novel") .db("o_novel")
.where("id", item.id) .where("id", item.id)
.update({ event: item.event, eventState: item.event ? 1 : -1 }); .update({ event: item.event, eventState: item.event ? 1 : -1, errorReason: item?.errorReason ?? null });
}); });
novel.start(allChapters, projectId); novel.start(allChapters, projectId);

View File

@ -20,7 +20,7 @@ export default router.post(
const data = await u const data = await u
.db("o_novel") .db("o_novel")
.where("projectId", projectId) .where("projectId", projectId)
.select("id", "chapterIndex as index", "reel", "chapter", "chapterData", "event", "eventState") .select("id", "chapterIndex as index", "reel", "chapter", "chapterData", "event", "eventState", "errorReason")
.andWhere((qb) => { .andWhere((qb) => {
if (search) { if (search) {
qb.where("chapter", "like", `%${search}%`); qb.where("chapter", "like", `%${search}%`);

View File

@ -0,0 +1,49 @@
import express from "express";
import u from "@/utils";
import { z } from "zod";
import { v4 as uuidv4 } from "uuid";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
import { Output } from "ai";
const router = express.Router();
export default router.post("/", validateFields({}), async (req, res) => {
const {} = req.body;
});
async function getLines() {
const resText = await u.Ai.Text("eventExtractAgent").invoke({
messages: [
{
role: "system",
content: `
##
1.
- "..."'...'......
-
2.
3.
4.
5. JSON
["台词1", "台词2", "台词3"]
`,
},
{
role: "user",
content: `
`,
},
],
output: Output.array({
element: z.object({
lines: z.string().describe("台词内容"),
}),
}),
});
const parseLines = JSON.parse(resText.text);
const chatLines = parseLines.elements.map((i) => i.lines);
return chatLines;
}

View File

@ -12,15 +12,30 @@ export default router.post(
name: z.string(), name: z.string(),
content: z.string(), content: z.string(),
projectId: z.number(), projectId: z.number(),
assets: z.array(z.number()),
}), }),
async (req, res) => { async (req, res) => {
const { name, content, projectId } = req.body; const { name, content, projectId, assets } = req.body;
await u.db("o_script").insert({ const [scriptId] = await u.db("o_script").insert({
name, name,
content, content,
projectId, projectId,
createTime: Date.now(), createTime: Date.now(),
}); });
if (assets.length) {
const assetsData = await u.db("o_assets").whereIn("id", assets).select();
if (assetsData.length) {
const assetsIds = assetsData.map((item) => item.id);
const insertData = assetsIds.map((i) => {
return {
scriptId,
assetId: i,
};
});
await u.db("o_scriptAssets").insert(insertData);
}
}
res.status(200).send(success({ message: "添加剧本成功" })); res.status(200).send(success({ message: "添加剧本成功" }));
}, },
); );

View File

@ -17,7 +17,32 @@ export default router.post(
if (name) { if (name) {
query = query.andWhere("name", "like", `%${name}%`); query = query.andWhere("name", "like", `%${name}%`);
} }
const data = await query; const data = await query;
res.status(200).send(success(data)); const assetsData = await u
.db("o_assets")
.leftJoin("o_scriptAssets", "o_assets.id", "o_scriptAssets.assetId")
.whereIn(
"o_scriptAssets.scriptId",
data.map((i) => i.id),
)
.select("o_assets.id", "o_assets.name", "o_scriptAssets.scriptId");
console.log("%c Line:23 🍷 assetsData", "background:#ffdd4d", assetsData);
const scriptAssetsMap: Record<number, { id: number; name: string }[]> = {};
assetsData.forEach((i) => {
if (scriptAssetsMap[i.scriptId]) {
scriptAssetsMap[i.scriptId].push({ id: i.id, name: i.name });
} else {
scriptAssetsMap[i.scriptId] = [{ id: i.id, name: i.name }];
}
});
const returnData = data.map((i) => ({
id: i.id,
name: i.name,
content: i.content,
createTime: i.createTime,
assets: scriptAssetsMap[i.id!] || [],
}));
res.status(200).send(success(returnData));
}, },
); );

View File

@ -12,13 +12,28 @@ export default router.post(
id: z.number(), id: z.number(),
name: z.string(), name: z.string(),
content: z.string(), content: z.string(),
assets: z.array(z.number()),
}), }),
async (req, res) => { async (req, res) => {
const { id, name, content } = req.body; const { id, name, content, assets } = req.body;
await u.db("o_script").where({ id }).update({ await u.db("o_script").where({ id }).update({
name, name,
content, content,
}); });
if (assets.length) {
const assetsData = await u.db("o_assets").whereIn("id", assets).select();
await u.db("o_scriptAssets").where({ scriptId: id }).delete();
if (assetsData.length) {
const insertData = assetsData.map((item) => {
return {
scriptId: id,
assetId: item.id,
};
});
await u.db("o_scriptAssets").insert(insertData);
}
}
res.status(200).send(success({ message: "编辑剧本成功" })); res.status(200).send(success({ message: "编辑剧本成功" }));
}, },
); );

View File

@ -1,4 +1,4 @@
// @db-hash f73a46df6ee14425a01df5c1ff88fcb2 // @db-hash b6146b9f91d8b9853e0f6fcb41c3145b
//该文件由脚本自动生成,请勿手动修改 //该文件由脚本自动生成,请勿手动修改
export interface memories { export interface memories {
@ -123,6 +123,10 @@ export interface o_script {
'name'?: string | null; 'name'?: string | null;
'projectId'?: number | null; 'projectId'?: number | null;
} }
export interface o_scriptAssets {
'assetId'?: number;
'scriptId'?: number;
}
export interface o_setting { export interface o_setting {
'key'?: string | null; 'key'?: string | null;
'value'?: string | null; 'value'?: string | null;
@ -215,6 +219,7 @@ export interface DB {
"o_outlineNovel": o_outlineNovel; "o_outlineNovel": o_outlineNovel;
"o_project": o_project; "o_project": o_project;
"o_script": o_script; "o_script": o_script;
"o_scriptAssets": o_scriptAssets;
"o_setting": o_setting; "o_setting": o_setting;
"o_storyboard": o_storyboard; "o_storyboard": o_storyboard;
"o_storyboardFlow": o_storyboardFlow; "o_storyboardFlow": o_storyboardFlow;

View File

@ -60,7 +60,7 @@ class CleanNovel {
this.emitter.emit("item", { id: novel.id, event: preData }); this.emitter.emit("item", { id: novel.id, event: preData });
totalEvent.push({ id: novel.id!, event: preData }); totalEvent.push({ id: novel.id!, event: preData });
} catch (e) { } catch (e) {
this.emitter.emit("item", { id: novel.id, event: null }); this.emitter.emit("item", { id: novel.id, event: null, errorReason: u.error(e).message });
} }
} }
} catch (e) { } catch (e) {