From e6dff8a62d48b11668dc67d06168986148dae0d1 Mon Sep 17 00:00:00 2001 From: zichun <26684461+reporkey@users.noreply.github.com> Date: Tue, 21 Jul 2026 09:32:09 +0800 Subject: [PATCH] Add form-card export: viw_kg_form_card + export_form_cards.sh (deliverable 4) --- sql/.gitignore | 3 +++ sql/export_form_cards.sh | 37 +++++++++++++++++++++++++++++++++++++ sql/viw_kg_form_card.sql | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 0 deletions(-) create mode 100644 sql/.gitignore create mode 100755 sql/export_form_cards.sh create mode 100644 sql/viw_kg_form_card.sql diff --git a/sql/.gitignore b/sql/.gitignore new file mode 100644 index 0000000..bf24f61 --- /dev/null +++ b/sql/.gitignore @@ -0,0 +1,3 @@ +# Generated RAG corpus — reproduce with ./export_form_cards.sh +form_cards.jsonl +*.jsonl diff --git a/sql/export_form_cards.sh b/sql/export_form_cards.sh new file mode 100755 index 0000000..2783fda --- /dev/null +++ b/sql/export_form_cards.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# ============================================================ +# export_form_cards.sh —— 导出 1748 张 ERP 表单卡片为 JSONL (GraphRAG 交付物4) +# 每行一个 JSON:{id, moduleId, title, domain, dataSource, execType, +# aiTool, aiScene, upstream, downstream, text} +# text = viw_kg_form_card.sCard,可直接切块灌向量库(Milvus)。 +# +# 依赖视图:viw_kg_form_card ← viw_kg_form ← viw_kg_edge_flow ← viw_ai_useful_forms +# 用法: ./export_form_cards.sh [输出文件, 默认 form_cards.jsonl] +# 注意:必须 --no-defaults(本地 ~/.my.cnf 默认指向不存在的库 xlyweberp_saas_ai)。 +# group_concat_max_len 提到 1e6 防字段清单截断(最长表单 269 字段)。 +# ============================================================ +set -euo pipefail + +OUT="${1:-form_cards.jsonl}" +DB_ARGS=(--no-defaults -h127.0.0.1 -P33307 -uroot -plocal xlyweberp_saas) + +mysql "${DB_ARGS[@]}" --batch --skip-column-names --raw 2>/dev/null <<'SQL' > "$OUT" +SET SESSION group_concat_max_len = 1000000; +SELECT JSON_OBJECT( + 'id', sFormId, + 'moduleId', sModuleId, + 'title', sFormTitle, + 'domain', sDomain, + 'dataSource', sDataSource, + 'execType', sExecType, + 'aiTool', bAiTool, + 'aiScene', sAiScene, + 'upstream', sUpstreamForms, + 'downstream', sDownstreamForms, + 'text', sCard +) +FROM viw_kg_form_card +ORDER BY sDomain, sFormTitle; +SQL + +echo "wrote $(wc -l < "$OUT" | tr -d ' ') form-cards to $OUT" diff --git a/sql/viw_kg_form_card.sql b/sql/viw_kg_form_card.sql new file mode 100644 index 0000000..a6a1491 --- /dev/null +++ b/sql/viw_kg_form_card.sql @@ -0,0 +1,56 @@ +-- ============================================================ +-- 视图:viw_kg_form_card —— ERP 知识图谱·表单卡片 (RAG 文档, 1748 行) +-- 每个表单一段结构化文本 sCard,用于灌入向量库做召回;另暴露结构化元数据列供过滤。 +-- 汇聚三层图谱:节点(viw_kg_form) + 上下游单据名(viw_kg_edge_flow) + 字段中文名清单。 +-- +-- ⚠ 字段清单用 GROUP_CONCAT 拼接,单表单字段可达 269 个 / 2477 字, +-- 默认 group_concat_max_len=1024 会截断 —— 查询前必须 +-- SET SESSION group_concat_max_len = 1000000; (见 export_form_cards.sql) +-- +-- sCard 结构:表单名 / 业务域 / 数据源(执行类型) / 上游单据 / 下游单据 / 字段 / 标识(formId,moduleId) +-- 节点粒度 = 表单 sFormId (1748);上下游为菜单级。 +-- ============================================================ +CREATE OR REPLACE VIEW viw_kg_form_card AS +SELECT + fm.sFormId, + fm.sModuleId, + fm.sFormTitle, + fm.sModuleName, + fm.sDomain, + fm.sDataSource, + fm.sExecType, + fm.iUpstream, + fm.iDownstream, + fm.bAiTool, + fm.sAiScene, + up.names AS sUpstreamForms, -- 上游单据名(逗号) + dn.names AS sDownstreamForms, -- 下游单据名(逗号) + fl.field_names AS sFieldList, -- 字段中文名清单(顿号) + CONCAT_WS('\n', + CONCAT('【表单】', fm.sFormTitle), + CONCAT('业务域:', fm.sDomain), + CONCAT('数据源:', fm.sDataSource, '(', fm.sExecType, ')'), + CONCAT('上游单据:', IFNULL(up.names, '无')), + CONCAT('下游单据:', IFNULL(dn.names, '无')), + CONCAT('字段:', IFNULL(fl.field_names, '')), + CONCAT('标识:formId=', fm.sFormId, ' moduleId=', fm.sModuleId, + CASE WHEN fm.bAiTool = 1 THEN CONCAT(' AI场景=', IFNULL(fm.sAiScene,'')) ELSE '' END) + ) AS sCard -- 可直接向量化的卡片文本 +FROM viw_kg_form fm +LEFT JOIN ( + SELECT sParentId, + GROUP_CONCAT(DISTINCT sChinese ORDER BY iOrder SEPARATOR '、') AS field_names + FROM gdsconfigformslave + WHERE IFNULL(sChinese,'') <> '' AND sControlName NOT LIKE 'Btn%' + GROUP BY sParentId +) fl ON fl.sParentId = fm.sFormId +LEFT JOIN ( + SELECT sSrcModuleId AS mid, + GROUP_CONCAT(DISTINCT sTgtName ORDER BY sTgtName SEPARATOR ',') AS names + FROM viw_kg_edge_flow WHERE bSelfLoop = 0 GROUP BY sSrcModuleId +) dn ON dn.mid = fm.sModuleId +LEFT JOIN ( + SELECT sTgtModuleId AS mid, + GROUP_CONCAT(DISTINCT sSrcName ORDER BY sSrcName SEPARATOR ',') AS names + FROM viw_kg_edge_flow WHERE bSelfLoop = 0 GROUP BY sTgtModuleId +) up ON up.mid = fm.sModuleId; -- libgit2 0.22.2