This commit is contained in:
ACT丶流星雨 2026-03-28 01:20:15 +08:00
commit 73ce27c55d
6 changed files with 22 additions and 46 deletions

View File

@ -14,8 +14,9 @@ export default router.post(
const { ids } = req.body; const { ids } = req.body;
const data = await u const data = await u
.db("o_assets") .db("o_assets")
.leftJoin("o_image", "o_assets.id", "o_image.assetsId") .leftJoin("o_image", "o_assets.imageId", "o_image.id")
.whereIn("o_assets.id", ids) .whereIn("o_assets.id", ids)
.whereNot("o_image.state", "生成中")
.select("o_image.state", "o_assets.id", "o_image.filePath"); .select("o_image.state", "o_assets.id", "o_image.filePath");
const result = await Promise.all( const result = await Promise.all(
data.map(async (item: any) => ({ data.map(async (item: any) => ({

View File

@ -12,7 +12,7 @@ export default router.post(
}), }),
async (req, res) => { async (req, res) => {
const { ids } = req.body; const { ids } = req.body;
const data = await u.db("o_assets").whereIn("id", ids).select("*"); const data = await u.db("o_assets").whereIn("id", ids).whereNot("promptState", "生成中").select("*");
res.status(200).send(success(data)); res.status(200).send(success(data));
}, },
); );

View File

@ -88,21 +88,18 @@ export default router.post("/", validateFields(requestSchema), async (req, res)
state: "生成中", state: "生成中",
assetsId: item.id, assetsId: item.id,
}); });
await u.db("o_assets").where("id", item.id).update({ imageId });
totalNovelId.push(imageId); totalNovelId.push(imageId);
} }
// 3. 按并发数限制并发生成 // 3. 后台异步并发生成,不阻塞响应
const limit = pLimit(concurrentCount ?? 1); const limit = pLimit(concurrentCount ?? 1);
const results: { assetsId: number; success: boolean; path?: string; message?: string }[] = [];
const tasks = items.map((item: { id: number; type: string; name: string; prompt: string; base64: string | null | undefined }, index: number) => const tasks = items.map((item: { id: number; type: string; name: string; prompt: string; base64: string | null | undefined }, index: number) =>
limit(async () => { limit(async () => {
const imageId = totalNovelId[index]; const imageId = totalNovelId[index];
const cfg = assetTypeConfig[item.type as AssetType]; const cfg = assetTypeConfig[item.type as AssetType];
if (!cfg) { if (!cfg) return;
results.push({ assetsId: item.id, success: false, message: `不支持的类型: ${item.type}` });
return;
}
await u.db("o_assets").where("id", item.id).update({ imageId }); await u.db("o_assets").where("id", item.id).update({ imageId });
@ -126,10 +123,7 @@ export default router.post("/", validateFields(requestSchema), async (req, res)
aiImage.save(imagePath); aiImage.save(imagePath);
const imageData = await u.db("o_image").where("id", imageId).select("*").first(); const imageData = await u.db("o_image").where("id", imageId).select("*").first();
if (!imageData) { if (!imageData) return;
results.push({ assetsId: item.id, success: false, message: "资产已被删除" });
return;
}
await u await u
.db("o_image") .db("o_image")
@ -142,28 +136,15 @@ export default router.post("/", validateFields(requestSchema), async (req, res)
resolution, resolution,
}); });
const path = await u.oss.getFileUrl(imagePath);
await u.db("o_assets").where("id", item.id).update({ imageId }); await u.db("o_assets").where("id", item.id).update({ imageId });
results.push({ assetsId: item.id, success: true, path });
} catch (e: any) { } catch (e: any) {
await u.db("o_image").where("id", imageId).update({ state: "生成失败" }); await u.db("o_image").where("id", imageId).update({ state: "生成失败" });
results.push({ assetsId: item.id, success: false, message: u.error(e).message || "图片生成失败" });
} }
}), }),
); );
await Promise.all(tasks); // 后台执行,不等待结果
Promise.all(tasks).catch(() => {});
const successCount = results.filter((r) => r.success).length; return res.status(200).send(success({ total: items.length }));
const failCount = results.filter((r) => !r.success).length;
return res.status(200).send(
success({
total: items.length,
successCount,
failCount,
results,
}),
);
}); });

View File

@ -99,17 +99,13 @@ export default router.post(
const assetsIds = items.map((item: { assetsId: number }) => item.assetsId); const assetsIds = items.map((item: { assetsId: number }) => item.assetsId);
await u.db("o_assets").whereIn("id", assetsIds).update({ promptState: "生成中" }); await u.db("o_assets").whereIn("id", assetsIds).update({ promptState: "生成中" });
// 按并发数限制并发生成 // 后台异步并发生成,不阻塞响应
const limit = pLimit(concurrentCount ?? 1); const limit = pLimit(concurrentCount ?? 1);
const results: { assetsId: number; success: boolean; prompt?: string; message?: string }[] = [];
const tasks = items.map((item: { assetsId: number; type: string; name: string; describe: string }) => const tasks = items.map((item: { assetsId: number; type: string; name: string; describe: string }) =>
limit(async () => { limit(async () => {
const config = typeConfig[item.type]; const config = typeConfig[item.type];
if (!config) { if (!config) return;
results.push({ assetsId: item.assetsId, success: false, message: "不支持的类型" });
return;
}
findItemByName(result, item.name, config.itemType); findItemByName(result, item.name, config.itemType);
@ -137,25 +133,20 @@ export default router.post(
})) as any; })) as any;
if (!_output) { if (!_output) {
results.push({ assetsId: item.assetsId, success: false, message: "生成结果为空" });
await u.db("o_assets").where("id", item.assetsId).update({ promptState: "生成失败" }); await u.db("o_assets").where("id", item.assetsId).update({ promptState: "生成失败" });
return; return;
} }
await u.db("o_assets").where("id", item.assetsId).update({ prompt: _output, promptState: "已完成" }); await u.db("o_assets").where("id", item.assetsId).update({ prompt: _output, promptState: "已完成" });
results.push({ assetsId: item.assetsId, success: true, prompt: _output });
} catch (e: any) { } catch (e: any) {
await u.db("o_assets").where("id", item.assetsId).update({ promptState: "生成失败" }); await u.db("o_assets").where("id", item.assetsId).update({ promptState: "生成失败" });
results.push({ assetsId: item.assetsId, success: false, message: e?.data?.error?.message ?? e?.message ?? "生成失败" });
} }
}), }),
); );
await Promise.all(tasks); // 后台执行,不等待结果
Promise.all(tasks).catch(() => {});
const successCount = results.filter((r) => r.success).length; return res.status(200).send(success({ total: items.length }));
const failCount = results.filter((r) => !r.success).length;
return res.status(200).send(success({ total: items.length, successCount, failCount, results }));
}, },
); );

View File

@ -90,7 +90,8 @@ export default router.post(
const errorMsg = result.error.issues.map((e) => `${e.path.join(".")}: ${e.message}`).join("; "); const errorMsg = result.error.issues.map((e) => `${e.path.join(".")}: ${e.message}`).join("; ");
return res.status(400).send(error(`vendor配置校验失败: ${errorMsg}`)); return res.status(400).send(error(`vendor配置校验失败: ${errorMsg}`));
} }
if (vendor.id.include(":")) return res.status(400).send(error("id不能包含英文冒号"));
if ((vendor.id as string).includes(":")) return res.status(400).send(error("id不能包含英文冒号"));
await u.db("o_vendorConfig").insert({ await u.db("o_vendorConfig").insert({
id: vendor.id, id: vendor.id,
author: vendor.author, author: vendor.author,

View File

@ -1,4 +1,4 @@
// @db-hash 8e5f2b7a28d4494b291d802b055b6399 // @db-hash 05ecfd675f848d88631c1a546996caea
//该文件由脚本自动生成,请勿手动修改 //该文件由脚本自动生成,请勿手动修改
export interface memories { export interface memories {
@ -7,7 +7,6 @@ export interface memories {
'embedding'?: string | null; 'embedding'?: string | null;
'id'?: string; 'id'?: string;
'isolationKey': string; 'isolationKey': string;
'name'?: string | null;
'relatedMessageIds'?: string | null; 'relatedMessageIds'?: string | null;
'role'?: string | null; 'role'?: string | null;
'summarized'?: number | null; 'summarized'?: number | null;
@ -47,6 +46,7 @@ export interface o_assets {
'name'?: string | null; 'name'?: string | null;
'projectId'?: number | null; 'projectId'?: number | null;
'prompt'?: string | null; 'prompt'?: string | null;
'promptState'?: string | null;
'remark'?: string | null; 'remark'?: string | null;
'scriptId'?: number | null; 'scriptId'?: number | null;
'startTime'?: number | null; 'startTime'?: number | null;
@ -121,11 +121,13 @@ export interface o_project {
export interface o_prompt { export interface o_prompt {
'id'?: number; 'id'?: number;
'name'?: string | null; 'name'?: string | null;
'rompt'?: string | null; 'prompt'?: string | null;
} }
export interface o_script { export interface o_script {
'content'?: string | null; 'content'?: string | null;
'createTime'?: number | null; 'createTime'?: number | null;
'errorReason'?: string | null;
'extractState'?: number | null;
'id'?: number; 'id'?: number;
'name'?: string | null; 'name'?: string | null;
'projectId'?: number | null; 'projectId'?: number | null;