修复资产轮询

This commit is contained in:
小帅 2026-03-28 00:25:53 +08:00
parent a947ce5824
commit 6c39194964
5 changed files with 20 additions and 45 deletions

View File

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

View File

@ -12,7 +12,7 @@ export default router.post(
}),
async (req, res) => {
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));
},
);

View File

@ -88,21 +88,18 @@ export default router.post("/", validateFields(requestSchema), async (req, res)
state: "生成中",
assetsId: item.id,
});
await u.db("o_assets").where("id", item.id).update({ imageId });
totalNovelId.push(imageId);
}
// 3. 按并发数限制并发生成
// 3. 后台异步并发生成,不阻塞响应
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) =>
limit(async () => {
const imageId = totalNovelId[index];
const cfg = assetTypeConfig[item.type as AssetType];
if (!cfg) {
results.push({ assetsId: item.id, success: false, message: `不支持的类型: ${item.type}` });
return;
}
if (!cfg) return;
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);
const imageData = await u.db("o_image").where("id", imageId).select("*").first();
if (!imageData) {
results.push({ assetsId: item.id, success: false, message: "资产已被删除" });
return;
}
if (!imageData) return;
await u
.db("o_image")
@ -142,28 +136,15 @@ export default router.post("/", validateFields(requestSchema), async (req, res)
resolution,
});
const path = await u.oss.getFileUrl(imagePath);
await u.db("o_assets").where("id", item.id).update({ imageId });
results.push({ assetsId: item.id, success: true, path });
} catch (e: any) {
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;
const failCount = results.filter((r) => !r.success).length;
return res.status(200).send(
success({
total: items.length,
successCount,
failCount,
results,
}),
);
return res.status(200).send(success({ total: items.length }));
});

View File

@ -99,17 +99,13 @@ export default router.post(
const assetsIds = items.map((item: { assetsId: number }) => item.assetsId);
await u.db("o_assets").whereIn("id", assetsIds).update({ promptState: "生成中" });
// 按并发数限制并发生成
// 后台异步并发生成,不阻塞响应
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 }) =>
limit(async () => {
const config = typeConfig[item.type];
if (!config) {
results.push({ assetsId: item.assetsId, success: false, message: "不支持的类型" });
return;
}
if (!config) return;
findItemByName(result, item.name, config.itemType);
@ -137,25 +133,20 @@ export default router.post(
})) as any;
if (!_output) {
results.push({ assetsId: item.assetsId, success: false, message: "生成结果为空" });
await u.db("o_assets").where("id", item.assetsId).update({ promptState: "生成失败" });
return;
}
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) {
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;
const failCount = results.filter((r) => !r.success).length;
return res.status(200).send(success({ total: items.length, successCount, failCount, results }));
return res.status(200).send(success({ total: items.length }));
},
);

View File

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