-- ============================================================
-- 视图：viw_kg_field_dict —— ERP 知识图谱·字段术语字典 (NL2SQL 术语接地)
-- 一行 = 一个 (中文名 → 字段列名 → 表) 映射，让 LLM 把自然语言词汇落到真实列。
--   例：客户名称 → sCustomerName @ salsalesordermaster
--       业务员   → sSalesManId  @ salsalesordermaster (外键→ sissalesman.sId)
--
-- 来源：字段控件 gdsconfigformslave.sChinese(中文名) + sName(列名)，
--       表 = 所属主表单 gdsconfigformmaster.sTbName。
-- 剔除：按钮控件(Btn%)、空名、计算列(含 '(' / concat)。
-- iFormUses = 有多少张表单用了此映射（术语显著度，可用于同名消歧排序）。
-- 若该字段是外键(命中 viw_kg_edge_ref)，带出 sFkTable/sFkKey —— NL2SQL 直接知道 join 到哪。
-- 表名统一小写；sDomain 由表名规范前缀推导(同 viw_kg_form 口径)。
-- 校验（本地库 xlyweberp_saas）：约 38105 条 (表,字段,中文名) 去重映射。
-- ============================================================
CREATE OR REPLACE VIEW viw_kg_field_dict AS
SELECT
    d.sChinese,                                          -- 业务中文名(术语)
    d.sField,                                            -- 真实列名
    d.sTable,                                            -- 所属表(小写)
    CASE LEFT(REGEXP_REPLACE(d.sTable,'^(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,   -- 业务域
    d.iFormUses,                                         -- 使用此映射的表单数(显著度)
    r.sTgtTable                                          AS sFkTable,  -- 外键目标表(若为引用字段)
    r.sTgtKey                                            AS sFkKey     -- 外键目标主键
FROM (
    SELECT LOWER(m.sTbName) AS sTable, s.sName AS sField, s.sChinese AS sChinese,
           COUNT(DISTINCT s.sParentId) AS iFormUses
    FROM gdsconfigformslave s
    JOIN gdsconfigformmaster m ON s.sParentId = m.sId
    WHERE IFNULL(s.sChinese,'') <> ''
      AND IFNULL(s.sName,'')    <> ''
      AND s.sControlName NOT LIKE 'Btn%'
      AND IFNULL(m.sTbName,'')  <> ''
      AND s.sName NOT LIKE '%(%'
      AND s.sName NOT LIKE '%concat%'
    GROUP BY LOWER(m.sTbName), s.sName, s.sChinese
) d
LEFT JOIN viw_kg_edge_ref r ON r.sSrcTable = d.sTable AND r.sSrcField = d.sField;
