-- ============================================================
-- M23 数据报表中心目录与算法口径
--   报表页面的规则说明与目录从数据库读取，指标由业务表实时聚合。
-- ============================================================

CREATE TABLE admin_report_definitions
(
    code        VARCHAR(64)  NOT NULL,
    name        VARCHAR(128) NOT NULL,
    scope       VARCHAR(255) NOT NULL,
    data_source VARCHAR(255) NOT NULL,
    owner       VARCHAR(64)  NOT NULL DEFAULT '系统',
    status      VARCHAR(32)  NOT NULL DEFAULT '已生成',
    sort_order  INT          NOT NULL DEFAULT 0,
    updated_at  DATETIME(3)  NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
    PRIMARY KEY (code)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT '数据报表中心目录';

CREATE TABLE admin_report_rules
(
    code       VARCHAR(64)  NOT NULL,
    name       VARCHAR(128) NOT NULL,
    scope      TEXT         NOT NULL,
    formula    TEXT         NOT NULL,
    owner      VARCHAR(64)  NOT NULL DEFAULT '系统',
    editable   VARCHAR(255) NOT NULL DEFAULT '需管理员确认',
    notes      TEXT,
    status     TINYINT      NOT NULL DEFAULT 1,
    sort_order INT          NOT NULL DEFAULT 0,
    updated_at DATETIME(3)  NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
    PRIMARY KEY (code)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT '数据报表算法口径';

INSERT INTO admin_report_definitions (code, name, scope, data_source, owner, status, sort_order)
VALUES
    ('conversion_funnel', '付费转化漏斗', '注册企业 / 付费企业 / 复购企业', 'tenants, billing_records', '系统', '已生成', 10),
    ('resource_consumption', '资源消耗结构', '模型 / 模态 / 成功调用 / 积分消耗', 'billing_records', '系统', '已生成', 20),
    ('tenant_activity', '企业活跃度分层', '登录 / 项目更新 / 任务流水', 'tenants, users, projects, billing_records', '系统', '已生成', 30),
    ('billing_aov', '订单客单与充值', '充值笔数 / 充值积分 / 平均单笔', 'billing_records, tenant_balances', '财务运营', '已生成', 40),
    ('quota_capacity', '套餐容量与配额', '成员 / 项目 / 月积分 / 并发上限', 'plans, tenant_quotas, tenants', '运营负责人', '已生成', 50)
ON DUPLICATE KEY UPDATE
    name = VALUES(name),
    scope = VALUES(scope),
    data_source = VALUES(data_source),
    owner = VALUES(owner),
    status = VALUES(status),
    sort_order = VALUES(sort_order);

INSERT INTO admin_report_rules (code, name, scope, formula, owner, editable, notes, status, sort_order)
VALUES
    ('paid_conversion_rate', '付费转化率', '衡量全部有效企业中产生过真实充值流水的比例。排除已删除租户，充值以 billing_records 中 operation=recharge 或 modality=RECHARGE 且 credits>0 为准。', '付费转化率 = 付费企业数 / 有效企业数 * 100%', '运营负责人', '可调整排除条件', '用于销售漏斗、入驻质量和套餐转化分析。', 1, 10),
    ('repurchase_rate', '复购率', '同一企业产生 2 笔及以上真实充值流水即记为复购。赠送、补偿和失败流水不计入。', '复购率 = 复购企业数 / 已付费企业数 * 100%', '计费负责人', '可调整复购窗口', '当前开发库未单独建订单表，先以资源充值流水承载付费订单口径。', 1, 20),
    ('resource_consumption', '资源消耗结构', '按成功模型调用流水统计，充值、失败任务、取消或回滚流水不纳入消耗。', '模型消耗 = SUM(billing_records.credits WHERE 非充值 AND success=true)', '财务运营', '只允许调整维度分组', '用于模型成本复盘和资源包定价。', 1, 30),
    ('tenant_activity', '企业活跃分层', '按最近登录、项目更新、模型调用三类行为综合判断企业活跃度。', '活跃企业 = 近7天登录 OR 近14天项目更新 OR 近14天有资源流水；沉睡企业 = 30天无有效行为', '客服主管', '可调整天数阈值', '沉睡企业可进入运营预警和客服回访。', 1, 40),
    ('average_recharge', '平均单笔充值积分', '仅统计 credits>0 的真实充值流水，作为当前资源包订单的金额替代口径。', '平均单笔充值积分 = 充值积分合计 / 充值笔数', '财务运营', '可在接入订单表后替换为实付金额', '正式订单/发票表上线后应迁移为 paid_amount 口径。', 1, 50),
    ('monthly_report', '月报生成规则', '每月 1 日生成上月数据，支持人工重算；规则版本和操作者需要进入审计日志。', '月报 = 按规则快照汇总 tenants / billing_records / users / projects / tenant_quotas', '系统', '需管理员确认', '规则变更后建议重算最近一个自然月。', 1, 60)
ON DUPLICATE KEY UPDATE
    name = VALUES(name),
    scope = VALUES(scope),
    formula = VALUES(formula),
    owner = VALUES(owner),
    editable = VALUES(editable),
    notes = VALUES(notes),
    status = VALUES(status),
    sort_order = VALUES(sort_order);
