-- ============================================================
-- 视图：viw_kg_form —— ERP 知识图谱·表单节点 (form nodes, 1748 行)
-- 在 viw_ai_useful_forms(节点目录) 之上富化每个表单节点：
--   业务域 sDomain (L1 路由) · 数据源/执行类型 · 上下游单据数(来自 viw_kg_edge_flow) · AI工具挂载
--
-- 业务域 sDomain 推导（best-effort，L1 路由用，价值最低的一层）：
--   最可靠信号是数据源表名。命名高度规范：剥掉 viw_/sp_ 包装前缀后，
--   前缀词即业务域 (sal=销售 pur=采购 mft/man=生产 quo=报价 qly=品质 ops=发外
--   mit/inv/pit/sgd/sto=库存 cah/pay/rec/bil/cos=财务 ele/sis=基础资料 ept=设备)。
--   命中 61 张 AI 工具表单时，另有 bAiTool/sAiScene 作权威场景标注。
--   剩余无法归类者 = '其他'。原始信号(sDataSource/sModelType)一并暴露供下游细化。
--
-- 上下游计数（来自 viw_kg_edge_flow，按菜单粒度聚合，排除自环补单）：
--   iDownstream = 本单据可「生成」的不同目标单据数
--   iUpstream   = 有多少不同上游单据可「生成」本单据
--   bHasFlow    = 是否参与任何单据流转
--
-- 节点粒度 = 表单 sFormId (1748 唯一)；同一菜单下多表单共享菜单级的上下游计数。
-- ============================================================
CREATE OR REPLACE VIEW viw_kg_form AS
SELECT
    u.sModuleId,                                   -- 菜单窗体id (= 接口 sModelsId)
    u.sFormId,                                     -- 表单id (= 接口路径 id, 节点主键)
    u.sModuleName,                                 -- 菜单/窗体名
    u.sFormTitle,                                  -- 表单标题
    /* --- 业务域 L1（表名规范前缀 → 域）--- */
    CASE LEFT(LOWER(REGEXP_REPLACE(IFNULL(u.sDataSource,''),'^(viw_|viw|v_|sp_|sp|proc_|proc|udf_|fun_|calc_)','')), 3)
        WHEN 'sal' THEN '销售'
        WHEN 'pur' THEN '采购'
        WHEN 'quo' THEN '报价'
        WHEN 'qly' THEN '品质'
        WHEN 'ops' THEN '发外'
        WHEN 'mft' THEN '生产'
        WHEN 'man' THEN '生产'
        WHEN 'mes' THEN '生产'
        WHEN 'wor' THEN '生产'
        WHEN 'mit' THEN '库存'
        WHEN 'inv' THEN '库存'
        WHEN 'pit' THEN '库存'
        WHEN 'sgd' THEN '库存'
        WHEN 'sto' THEN '库存'
        WHEN 'cah' THEN '财务'
        WHEN 'pay' THEN '财务'
        WHEN 'rec' THEN '财务'
        WHEN 'bil' THEN '财务'
        WHEN 'cos' THEN '财务'
        WHEN 'cas' THEN '财务'
        WHEN 'ele' THEN '基础资料'
        WHEN 'sis' THEN '基础资料'
        WHEN 'con' THEN '基础资料'
        WHEN 'ept' THEN '设备'
        ELSE '其他'
    END                                            AS sDomain,       -- 业务域(L1 路由, best-effort)
    u.sModelType,                                  -- 原始前端路由(信号, 可空)
    u.sDataSource,                                 -- 数据源(表/视图/过程)
    u.sExecType,                                   -- 执行类型 table/view/proc
    u.bIsGrid,                                     -- 1=列表型
    u.bVisibleMenu,                                -- 1=主菜单可见
    IFNULL(d.n_down, 0)                            AS iDownstream,   -- 可生成的下游单据数
    IFNULL(up.n_up, 0)                             AS iUpstream,     -- 上游来源单据数
    CAST(IFNULL(d.n_down,0) + IFNULL(up.n_up,0) > 0 AS UNSIGNED) AS bHasFlow, -- 参与流转
    CAST(t.sSrcFormId IS NOT NULL AS UNSIGNED)     AS bAiTool,       -- 已挂载 AI 工具
    t.sceneName                                    AS sAiScene       -- AI 场景(权威, 仅工具表单)
FROM viw_ai_useful_forms u
LEFT JOIN (
    SELECT sSrcModuleId AS mid, COUNT(DISTINCT sTgtModuleId) AS n_down
    FROM viw_kg_edge_flow WHERE bSelfLoop = 0 GROUP BY sSrcModuleId
) d  ON d.mid  = u.sModuleId
LEFT JOIN (
    SELECT sTgtModuleId AS mid, COUNT(DISTINCT sSrcModuleId) AS n_up
    FROM viw_kg_edge_flow WHERE bSelfLoop = 0 GROUP BY sTgtModuleId
) up ON up.mid = u.sModuleId
LEFT JOIN (
    SELECT sSrcFormId, MIN(sceneName) AS sceneName FROM ai_tool GROUP BY sSrcFormId
) t  ON t.sSrcFormId = u.sModuleId;
