-- ============================================================
-- 关系图谱 MySQL 结果表
-- 说明：
-- 1. 表名和核心字段保持关系图谱平台 SQL 口径。
-- 2. lx_rel_node 为统一点表，家庭、工商等来源都落同一张点表。
-- 3. 边表按关系类型拆分，页面查询时由后端统一读取并合并展示。
-- 4. 家庭关系个人点 object_key 使用身份证号 MD5，便于和资金图谱主体口径对齐。
-- 5. 家庭边按两端 object_key 无向去重，避免夫妻双方都是员工时出现两条边。
-- ============================================================

CREATE TABLE IF NOT EXISTS lx_rel_node (
    object_key   VARCHAR(128) NOT NULL COMMENT '节点唯一标识；家庭个人为身份证MD5，工商企业/股东/法人沿用图谱源主键',
    node_name    VARCHAR(255) NULL COMMENT '节点名称',
    id_number    VARCHAR(128) NULL COMMENT '证件号或统一社会信用代码',
    subject_type VARCHAR(32)  NULL COMMENT '主体类型，如个人、企业',
    source_type  VARCHAR(255) NULL COMMENT '来源类型，可聚合多个来源值',
    detail_ref_type VARCHAR(64)  NULL COMMENT '详情来源类型，如 STAFF_FAMILY、ENTERPRISE_BASE、ECI_COMPANY',
    detail_ref_key  VARCHAR(128) NULL COMMENT '详情来源主键，如身份证号、统一社会信用代码、company_id',
    created_time DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_time DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (object_key),
    KEY idx_lx_rel_node_name (node_name),
    KEY idx_lx_rel_node_id_number (id_number),
    KEY idx_lx_rel_node_subject_type (subject_type),
    KEY idx_lx_rel_node_source_type (source_type),
    KEY idx_lx_rel_node_detail_ref (detail_ref_type, detail_ref_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='关系图谱统一节点表';

-- 兼容已提前建过旧版 lx_rel_node 的生产环境：IF NOT EXISTS 不会补新增字段。
SET @current_schema = DATABASE();
SET @ddl_sql = IF(
    (SELECT COUNT(1) FROM INFORMATION_SCHEMA.COLUMNS
     WHERE TABLE_SCHEMA = @current_schema AND TABLE_NAME = 'lx_rel_node' AND COLUMN_NAME = 'detail_ref_type') = 0,
    'ALTER TABLE lx_rel_node ADD COLUMN detail_ref_type VARCHAR(64) NULL COMMENT ''详情来源类型，如 STAFF_FAMILY、ENTERPRISE_BASE、ECI_COMPANY'' AFTER source_type',
    'SELECT 1'
);
PREPARE stmt FROM @ddl_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @ddl_sql = IF(
    (SELECT COUNT(1) FROM INFORMATION_SCHEMA.COLUMNS
     WHERE TABLE_SCHEMA = @current_schema AND TABLE_NAME = 'lx_rel_node' AND COLUMN_NAME = 'detail_ref_key') = 0,
    'ALTER TABLE lx_rel_node ADD COLUMN detail_ref_key VARCHAR(128) NULL COMMENT ''详情来源主键，如身份证号、统一社会信用代码、company_id'' AFTER detail_ref_type',
    'SELECT 1'
);
PREPARE stmt FROM @ddl_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @ddl_sql = IF(
    (SELECT COUNT(1) FROM INFORMATION_SCHEMA.STATISTICS
     WHERE TABLE_SCHEMA = @current_schema AND TABLE_NAME = 'lx_rel_node' AND INDEX_NAME = 'idx_lx_rel_node_detail_ref') = 0,
    'ALTER TABLE lx_rel_node ADD KEY idx_lx_rel_node_detail_ref (detail_ref_type, detail_ref_key)',
    'SELECT 1'
);
PREPARE stmt FROM @ddl_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

CREATE TABLE IF NOT EXISTS lx_rel_family_edge (
    object_key         VARCHAR(64)  NOT NULL COMMENT '家庭关系边唯一标识，按两端节点无向MD5生成',
    from_key           VARCHAR(160) NOT NULL COMMENT '起点，格式 rel_node/{object_key}',
    to_key             VARCHAR(160) NOT NULL COMMENT '终点，格式 rel_node/{object_key}',
    person_id          VARCHAR(255) NULL COMMENT '员工身份证号；双向归并时可为多个证件号拼接',
    relation_name      VARCHAR(255) NULL COMMENT '关系人姓名；双向归并时可为多个姓名拼接',
    relation_type      VARCHAR(255) NULL COMMENT '关系类型；双向归并时可为多个关系拼接',
    relation_cert_no   VARCHAR(255) NULL COMMENT '关系人证件号；双向归并时可为多个证件号拼接',
    gender             VARCHAR(32)  NULL COMMENT '性别',
    birth_date         VARCHAR(32)  NULL COMMENT '出生日期',
    relation_cert_type VARCHAR(64)  NULL COMMENT '关系人证件类型',
    mobile_phone1      VARCHAR(64)  NULL COMMENT '手机号码1',
    mobile_phone2      VARCHAR(64)  NULL COMMENT '手机号码2',
    wechat_no1         VARCHAR(128) NULL COMMENT '微信名称1',
    wechat_no2         VARCHAR(128) NULL COMMENT '微信名称2',
    wechat_no3         VARCHAR(128) NULL COMMENT '微信名称3',
    contact_address    VARCHAR(500) NULL COMMENT '联系地址',
    annual_income      DECIMAL(15,2) NULL COMMENT '家庭成员年收入（元/年）',
    relation_desc      VARCHAR(500) NULL COMMENT '关系详细描述',
    status             VARCHAR(16)  NULL COMMENT '状态',
    effective_date     VARCHAR(32)  NULL COMMENT '关系生效日期',
    invalid_date       VARCHAR(32)  NULL COMMENT '关系失效日期',
    remark             TEXT         NULL COMMENT '备注',
    data_source        VARCHAR(64)  NULL COMMENT '数据来源',
    created_time       DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_time       DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (object_key),
    KEY idx_lx_rel_family_from_key (from_key),
    KEY idx_lx_rel_family_to_key (to_key),
    KEY idx_lx_rel_family_person_id (person_id),
    KEY idx_lx_rel_family_relation_cert_no (relation_cert_no),
    KEY idx_lx_rel_family_relation_type (relation_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='关系图谱家庭关系边表';

CREATE TABLE IF NOT EXISTS lx_rel_stock_edge (
    object_key        VARCHAR(191) NOT NULL COMMENT '股东关系边唯一标识，沿用图谱SQL的 company_id + p_key_no + stock_type 口径',
    from_key          VARCHAR(160) NOT NULL COMMENT '起点，股东节点key，格式 rel_node/{p_key_no}',
    to_key            VARCHAR(160) NOT NULL COMMENT '终点，企业节点key，格式 rel_node/{company_id}',
    company_name      VARCHAR(255) NULL COMMENT '企业名称',
    stock_name        VARCHAR(255) NULL COMMENT '股东',
    stock_type        VARCHAR(64)  NULL COMMENT '股东类型',
    stock_percent     VARCHAR(64)  NULL COMMENT '持股比例',
    should_capi       VARCHAR(128) NULL COMMENT '认缴出资额',
    should_capi_value VARCHAR(128) NULL COMMENT '认缴出资额数值',
    should_capi_unit  VARCHAR(64)  NULL COMMENT '认缴出资额单位',
    shoud_date        VARCHAR(64)  NULL COMMENT '认缴出资日期',
    p_key_no          VARCHAR(128) NULL COMMENT '股东keyno',
    created_time      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_time      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (object_key),
    KEY idx_lx_rel_stock_from_key (from_key),
    KEY idx_lx_rel_stock_to_key (to_key),
    KEY idx_lx_rel_stock_p_key_no (p_key_no),
    KEY idx_lx_rel_stock_type (stock_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='关系图谱股东持股边表';

CREATE TABLE IF NOT EXISTS lx_rel_represent_edge (
    object_key   VARCHAR(191) NOT NULL COMMENT '法人关系边唯一标识，沿用图谱SQL的 company_id + oper_key_no 口径',
    from_key     VARCHAR(160) NOT NULL COMMENT '起点，法人节点key，格式 rel_node/{oper_key_no}',
    to_key       VARCHAR(160) NOT NULL COMMENT '终点，企业节点key，格式 rel_node/{company_id}',
    oper_name    VARCHAR(255) NULL COMMENT '法定代表人姓名',
    oper_key_no  VARCHAR(128) NULL COMMENT '法定代表人keyno',
    created_time DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_time DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (object_key),
    KEY idx_lx_rel_represent_from_key (from_key),
    KEY idx_lx_rel_represent_to_key (to_key),
    KEY idx_lx_rel_represent_oper_key_no (oper_key_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='关系图谱法定代表人边表';
