Merge branch '108' of https://github.com/HBAI-Ltd/Toonflow-app into 108
This commit is contained in:
commit
73ce27c55d
@ -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) => ({
|
||||
|
||||
@ -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));
|
||||
},
|
||||
);
|
||||
|
||||
@ -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 }));
|
||||
});
|
||||
|
||||
@ -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 }));
|
||||
},
|
||||
);
|
||||
|
||||
@ -90,7 +90,8 @@ export default router.post(
|
||||
const errorMsg = result.error.issues.map((e) => `${e.path.join(".")}: ${e.message}`).join("; ");
|
||||
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({
|
||||
id: vendor.id,
|
||||
author: vendor.author,
|
||||
|
||||
8
src/types/database.d.ts
vendored
8
src/types/database.d.ts
vendored
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user