-- ============================================================
-- 视图：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;
