From d3b5bd8611a978ba429530b6924551fbf71166b2 Mon Sep 17 00:00:00 2001 From: "wang.yu" Date: Thu, 20 Aug 2026 10:33:54 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E9=A2=86=E5=9F=9F?= =?utf8?q?=E6=96=B9=E6=A1=88=20AI=20=E8=B5=84=E4=BA=A7=E8=A1=A5=E5=85=A8?= =?utf8?q?=E6=9C=AA=E5=86=99=E5=85=A5=E8=A1=A8=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - handleDomainCompleteAssets 在 emit 结果前,将解析后的资产按 device_template_id 去重、sort_order 顺延追加写入 domain_template_assets - 此前仅 emit result 未落库,前端 load() 重载后覆盖本地新增行, 导致 AI 补全的设备建议不显示在资产表格中 --- db-sidecar.mjs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/db-sidecar.mjs b/db-sidecar.mjs index 6d4a05c..06d13c8 100644 --- a/db-sidecar.mjs +++ b/db-sidecar.mjs @@ -1794,6 +1794,16 @@ async function handleDomainCompleteAssets(req, res, tmplId) { if (r.created) createdNames.push(it.type); assets.push({ device_template_id: r.id, count: it.count, rule: it.rule }); } + // 落库:追加写入 domain_template_assets(按 device_template_id 去重,避免覆盖用户手动已录入的行) + const maxSort = db.prepare("SELECT COALESCE(MAX(sort_order), -1) AS m FROM domain_template_assets WHERE domain_template_id=?").get(tmplId).m; + let so = maxSort + 1; + const ins = db.prepare("INSERT INTO domain_template_assets (domain_template_id, device_template_id, count, rule, sort_order) VALUES (?,?,?,?,?)"); + const exists = db.prepare("SELECT 1 FROM domain_template_assets WHERE domain_template_id=? AND device_template_id=?"); + for (const a of assets) { + if (!a || !a.device_template_id) continue; + if (exists.get(tmplId, a.device_template_id)) continue; + ins.run(tmplId, Number(a.device_template_id), Number(a.count) || 0, a.rule || "", so++); + } emit({ log: `\n✓ 已生成 ${assets.length} 类设备配置${createdNames.length ? `,并自动创建设备模板:${createdNames.join("、")}` : ""}\n` }); emit({ result: assets, created: createdNames }); emit({ task: "AI 资产补全", status: "done" }); -- 2.43.0