-- ============================================================================= -- PBL Agent OS Phase 0/1 —— 全量建表 DDL(36 表) -- 方言:mariadb -- * 主键统一 BIGINT NOT NULL AUTO_INCREMENT -- * 编码/枚举列统一 varchar(32)(禁 ENUM) -- * 时间列统一 datetime(禁 TIMESTAMP) -- * 禁 FOREIGN KEY(关联靠应用层 + 索引) -- * 每张业务表首列强制 tenant_id varchar(32) NOT NULL,并作为复合索引首列 -- * ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci -- * 全部 CREATE TABLE IF NOT EXISTS —— 幂等可重复执行 -- 来源:projects/pbls/docs/01-design/data-model.md(36 表) -- ============================================================================= SET NAMES utf8mb4; -- ----------------------------------------------------------------------------- -- M1a pbl_blueprint —— 蓝图聚合根 + 7 类子对象 + 版本 + 模板(11 表) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_blueprint` ( `tenant_id` varchar(32) NOT NULL COMMENT '租户ID(强制打头)', `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `code` varchar(32) NOT NULL COMMENT '蓝图编码', `name` varchar(128) NOT NULL COMMENT '蓝图名称', `subject` varchar(32) DEFAULT NULL COMMENT '学科编码', `grade` varchar(32) DEFAULT NULL COMMENT '学段编码', `duration_hours` int NOT NULL DEFAULT 0 COMMENT '课时数', `status` varchar(32) NOT NULL DEFAULT 'draft' COMMENT '状态 draft/validating/validated/compiling/compiled/published/archived', `quality_level` varchar(32) NOT NULL DEFAULT 'L0' COMMENT '质量等级 L0~L4', `current_version` bigint NOT NULL DEFAULT 0 COMMENT '当前版本号', `template_id` bigint DEFAULT NULL COMMENT '来源模板ID(无FK)', `summary` varchar(512) DEFAULT NULL COMMENT '一句话摘要', `owner_id` varchar(32) DEFAULT NULL COMMENT '所有者', `extra` longtext DEFAULT NULL COMMENT '扩展JSON', `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '逻辑删除', `create_user` varchar(32) DEFAULT NULL, `create_time` datetime DEFAULT NULL, `update_user` varchar(32) DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_blueprint_tenant_code` (`tenant_id`,`code`), KEY `ix_pbl_blueprint_tenant_status` (`tenant_id`,`status`), KEY `ix_pbl_blueprint_tenant_subject` (`tenant_id`,`subject`,`grade`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='PBL蓝图聚合根'; CREATE TABLE IF NOT EXISTS `pbl_blueprint_version` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL COMMENT '蓝图ID(无FK)', `version` bigint NOT NULL COMMENT '版本号,从1递增', `snapshot` longtext NOT NULL COMMENT '版本全量快照JSON(确定性序列化)', `change_delta` longtext DEFAULT NULL COMMENT '与上一版差异JSON', `content_hash` varchar(64) NOT NULL COMMENT '快照sha256', `comment` varchar(512) DEFAULT NULL, `create_user` varchar(32) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_bpver_tenant_bp_ver` (`tenant_id`,`blueprint_id`,`version`), KEY `ix_pbl_bpver_tenant_hash` (`tenant_id`,`content_hash`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='蓝图版本快照与change_delta'; CREATE TABLE IF NOT EXISTS `pbl_blueprint_template` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `code` varchar(32) NOT NULL COMMENT '模板编码', `name` varchar(128) NOT NULL, `category` varchar(32) DEFAULT NULL COMMENT '模板分类', `subject` varchar(32) DEFAULT NULL, `grade` varchar(32) DEFAULT NULL, `definition` longtext NOT NULL COMMENT '模板定义JSON(含7类子对象骨架)', `offline_pack` longtext DEFAULT NULL COMMENT '离线兜底包JSON', `is_builtin` tinyint NOT NULL DEFAULT 0 COMMENT '是否内置模板', `status` varchar(32) NOT NULL DEFAULT 'enabled' COMMENT 'enabled/disabled', `create_user` varchar(32) DEFAULT NULL, `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_bptpl_tenant_code` (`tenant_id`,`code`), KEY `ix_pbl_bptpl_tenant_cat` (`tenant_id`,`category`,`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='蓝图模板(实例化+离线兜底)'; -- 7 类子对象泛化契约:统一列骨架(sub_type 区分),逐类独立建表便于索引与约束 CREATE TABLE IF NOT EXISTS `pbl_sub_world` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL, `code` varchar(32) NOT NULL, `name` varchar(128) NOT NULL, `sub_type` varchar(32) NOT NULL DEFAULT 'world', `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父对象ID,0=根', `sort_no` int NOT NULL DEFAULT 0, `payload` longtext DEFAULT NULL COMMENT '子对象业务载荷JSON', `ref_id` bigint DEFAULT NULL COMMENT '引用模块基表ID(world.id,只读不写)', `status` varchar(32) NOT NULL DEFAULT 'active', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_subworld_tenant_bp_code` (`tenant_id`,`blueprint_id`,`code`), KEY `ix_pbl_subworld_tenant_bp` (`tenant_id`,`blueprint_id`,`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='子对象-world'; CREATE TABLE IF NOT EXISTS `pbl_sub_scene` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL, `code` varchar(32) NOT NULL, `name` varchar(128) NOT NULL, `sub_type` varchar(32) NOT NULL DEFAULT 'scene', `parent_id` bigint NOT NULL DEFAULT 0, `sort_no` int NOT NULL DEFAULT 0, `payload` longtext DEFAULT NULL, `ref_id` bigint DEFAULT NULL COMMENT 'scene.id(只读)', `status` varchar(32) NOT NULL DEFAULT 'active', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_subscene_tenant_bp_code` (`tenant_id`,`blueprint_id`,`code`), KEY `ix_pbl_subscene_tenant_bp` (`tenant_id`,`blueprint_id`,`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='子对象-scene'; CREATE TABLE IF NOT EXISTS `pbl_sub_role` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL, `code` varchar(32) NOT NULL, `name` varchar(128) NOT NULL, `sub_type` varchar(32) NOT NULL DEFAULT 'role', `parent_id` bigint NOT NULL DEFAULT 0, `sort_no` int NOT NULL DEFAULT 0, `payload` longtext DEFAULT NULL COMMENT '角色职责/权限/人数上限', `ref_id` bigint DEFAULT NULL, `status` varchar(32) NOT NULL DEFAULT 'active', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_subrole_tenant_bp_code` (`tenant_id`,`blueprint_id`,`code`), KEY `ix_pbl_subrole_tenant_bp` (`tenant_id`,`blueprint_id`,`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='子对象-role'; CREATE TABLE IF NOT EXISTS `pbl_sub_task` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL, `code` varchar(32) NOT NULL, `name` varchar(128) NOT NULL, `sub_type` varchar(32) NOT NULL DEFAULT 'task', `parent_id` bigint NOT NULL DEFAULT 0, `sort_no` int NOT NULL DEFAULT 0, `stage` varchar(32) DEFAULT NULL COMMENT '所属阶段编码', `payload` longtext DEFAULT NULL COMMENT '任务目标/步骤/产出要求', `ref_id` bigint DEFAULT NULL, `status` varchar(32) NOT NULL DEFAULT 'active', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_subtask_tenant_bp_code` (`tenant_id`,`blueprint_id`,`code`), KEY `ix_pbl_subtask_tenant_bp_stage` (`tenant_id`,`blueprint_id`,`stage`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='子对象-task'; CREATE TABLE IF NOT EXISTS `pbl_sub_rule` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL, `code` varchar(32) NOT NULL, `name` varchar(128) NOT NULL, `sub_type` varchar(32) NOT NULL DEFAULT 'rule', `parent_id` bigint NOT NULL DEFAULT 0, `sort_no` int NOT NULL DEFAULT 0, `rule_kind` varchar(32) DEFAULT NULL COMMENT 'trigger/constraint/scoring/flow', `payload` longtext DEFAULT NULL COMMENT '规则表达式(script_engine 可编译)', `ref_id` bigint DEFAULT NULL COMMENT 'script_engine.script.id(只读)', `status` varchar(32) NOT NULL DEFAULT 'active', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_subrule_tenant_bp_code` (`tenant_id`,`blueprint_id`,`code`), KEY `ix_pbl_subrule_tenant_bp_kind` (`tenant_id`,`blueprint_id`,`rule_kind`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='子对象-rule'; CREATE TABLE IF NOT EXISTS `pbl_sub_artifact` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL, `code` varchar(32) NOT NULL, `name` varchar(128) NOT NULL, `sub_type` varchar(32) NOT NULL DEFAULT 'artifact', `parent_id` bigint NOT NULL DEFAULT 0, `sort_no` int NOT NULL DEFAULT 0, `artifact_type` varchar(32) DEFAULT NULL COMMENT '产出物类型编码', `payload` longtext DEFAULT NULL COMMENT '产出物规格/验收标准', `ref_id` bigint DEFAULT NULL, `status` varchar(32) NOT NULL DEFAULT 'active', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_subarti_tenant_bp_code` (`tenant_id`,`blueprint_id`,`code`), KEY `ix_pbl_subarti_tenant_bp_type` (`tenant_id`,`blueprint_id`,`artifact_type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='子对象-artifact(产出物定义)'; CREATE TABLE IF NOT EXISTS `pbl_sub_assessment` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL, `code` varchar(32) NOT NULL, `name` varchar(128) NOT NULL, `sub_type` varchar(32) NOT NULL DEFAULT 'assessment', `parent_id` bigint NOT NULL DEFAULT 0, `sort_no` int NOT NULL DEFAULT 0, `payload` longtext DEFAULT NULL COMMENT '评估维度/权重/rubric 引用', `ref_id` bigint DEFAULT NULL, `status` varchar(32) NOT NULL DEFAULT 'active', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_subassess_tenant_bp_code` (`tenant_id`,`blueprint_id`,`code`), KEY `ix_pbl_subassess_tenant_bp` (`tenant_id`,`blueprint_id`,`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='子对象-assessment(评估定义)'; CREATE TABLE IF NOT EXISTS `pbl_sub_link` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL, `from_type` varchar(32) NOT NULL COMMENT '源子对象类型', `from_id` bigint NOT NULL, `to_type` varchar(32) NOT NULL COMMENT '目标子对象类型', `to_id` bigint NOT NULL, `link_kind` varchar(32) NOT NULL DEFAULT 'ref' COMMENT 'ref/depends/produces/assesses', `payload` longtext DEFAULT NULL, `status` varchar(32) NOT NULL DEFAULT 'active', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_sublink_tenant_edge` (`tenant_id`,`blueprint_id`,`from_type`,`from_id`,`to_type`,`to_id`,`link_kind`), KEY `ix_pbl_sublink_tenant_to` (`tenant_id`,`blueprint_id`,`to_type`,`to_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='子对象关系边(泛化契约)'; -- ----------------------------------------------------------------------------- -- M2 pbl_validation —— 14 维校验 + 5 级质量状态(3 表) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_validation_rule` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `code` varchar(32) NOT NULL COMMENT '规则编码', `dimension` varchar(32) NOT NULL COMMENT '14 维之一', `name` varchar(128) NOT NULL, `severity` varchar(32) NOT NULL DEFAULT 'error' COMMENT 'error/warn/info', `expression` longtext DEFAULT NULL COMMENT '校验表达式/JSON', `is_builtin` tinyint NOT NULL DEFAULT 1, `enabled` tinyint NOT NULL DEFAULT 1, `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_vrule_tenant_code` (`tenant_id`,`code`), KEY `ix_pbl_vrule_tenant_dim` (`tenant_id`,`dimension`,`enabled`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='校验规则库(14维)'; CREATE TABLE IF NOT EXISTS `pbl_validation_run` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL, `version` bigint NOT NULL DEFAULT 0, `run_no` varchar(32) NOT NULL COMMENT '运行编号', `status` varchar(32) NOT NULL DEFAULT 'running' COMMENT 'running/passed/failed/error', `quality_level` varchar(32) NOT NULL DEFAULT 'L0' COMMENT 'L0~L4(5级质量状态)', `score` int NOT NULL DEFAULT 0, `error_count` int NOT NULL DEFAULT 0, `warn_count` int NOT NULL DEFAULT 0, `dim_result` longtext DEFAULT NULL COMMENT '14维结果JSON(确定性序列化)', `content_hash` varchar(64) DEFAULT NULL, `start_time` datetime DEFAULT NULL, `end_time` datetime DEFAULT NULL, `create_user` varchar(32) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_vrun_tenant_no` (`tenant_id`,`run_no`), KEY `ix_pbl_vrun_tenant_bp` (`tenant_id`,`blueprint_id`,`version`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='校验运行记录'; CREATE TABLE IF NOT EXISTS `pbl_validation_issue` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `run_id` bigint NOT NULL, `rule_code` varchar(32) NOT NULL, `dimension` varchar(32) NOT NULL, `severity` varchar(32) NOT NULL DEFAULT 'error', `target_type` varchar(32) DEFAULT NULL, `target_id` bigint DEFAULT NULL, `path` varchar(255) DEFAULT NULL COMMENT 'JSONPath 定位', `message` varchar(512) NOT NULL, `suggestion` varchar(512) DEFAULT NULL, `status` varchar(32) NOT NULL DEFAULT 'open' COMMENT 'open/fixed/ignored', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `ix_pbl_vissue_tenant_run` (`tenant_id`,`run_id`,`severity`), KEY `ix_pbl_vissue_tenant_rule` (`tenant_id`,`rule_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='校验问题明细'; -- ----------------------------------------------------------------------------- -- M3a/M3b pbl_compiler —— 确定性编译 + Game Definition(3 表) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_compile_job` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL, `version` bigint NOT NULL, `job_no` varchar(32) NOT NULL, `compiler_ver` varchar(32) NOT NULL DEFAULT 'v1' COMMENT '编译器版本', `status` varchar(32) NOT NULL DEFAULT 'pending' COMMENT 'pending/running/success/failed', `input_hash` varchar(64) NOT NULL COMMENT '输入快照sha256(确定性依据)', `output_hash` varchar(64) DEFAULT NULL, `log` longtext DEFAULT NULL, `start_time` datetime DEFAULT NULL, `end_time` datetime DEFAULT NULL, `create_user` varchar(32) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_cjob_tenant_no` (`tenant_id`,`job_no`), KEY `ix_pbl_cjob_tenant_bp` (`tenant_id`,`blueprint_id`,`version`), KEY `ix_pbl_cjob_tenant_inhash` (`tenant_id`,`input_hash`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='编译作业'; CREATE TABLE IF NOT EXISTS `pbl_compile_artifact` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `job_id` bigint NOT NULL, `kind` varchar(32) NOT NULL COMMENT 'game_definition/script/scene_pack/report', `name` varchar(128) NOT NULL, `content` longtext DEFAULT NULL COMMENT '产物内容(JSON/文本)', `file_path` varchar(255) DEFAULT NULL, `content_hash` varchar(64) NOT NULL, `size_bytes` bigint NOT NULL DEFAULT 0, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `ix_pbl_carti_tenant_job` (`tenant_id`,`job_id`,`kind`), KEY `ix_pbl_carti_tenant_hash` (`tenant_id`,`content_hash`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='编译产物'; CREATE TABLE IF NOT EXISTS `pbl_game_definition` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `blueprint_id` bigint NOT NULL, `version` bigint NOT NULL, `gd_version` varchar(32) NOT NULL DEFAULT '1.0' COMMENT 'Game Definition schema 版本', `definition` longtext NOT NULL COMMENT 'GD 全量JSON(world/scene/entity/rule/task/role/artifact)', `content_hash` varchar(64) NOT NULL, `status` varchar(32) NOT NULL DEFAULT 'draft' COMMENT 'draft/published/archived', `publish_time` datetime DEFAULT NULL, `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_gd_tenant_bp_ver` (`tenant_id`,`blueprint_id`,`version`), KEY `ix_pbl_gd_tenant_status` (`tenant_id`,`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Game Definition(编译终产物)'; -- ----------------------------------------------------------------------------- -- M4a/M4b pbl_agent_runtime —— Designer/Critic 运行时 + fail-closed 工具裁决(4 表) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_agent_tool_policy` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `tool_name` varchar(64) NOT NULL COMMENT '工具名(22 个之一)', `agent_role` varchar(32) NOT NULL DEFAULT '*' COMMENT 'designer/critic/*', `enabled` tinyint NOT NULL DEFAULT 0 COMMENT '默认0=fail-closed 拒绝', `risk_level` varchar(32) NOT NULL DEFAULT 'high' COMMENT 'low/medium/high', `reason` varchar(255) DEFAULT NULL COMMENT '启用/禁用理由', `write_scope` varchar(32) NOT NULL DEFAULT 'none' COMMENT 'none/pbl_only/protected', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_toolpol_tenant_tool_role` (`tenant_id`,`tool_name`,`agent_role`), KEY `ix_pbl_toolpol_tenant_enabled` (`tenant_id`,`enabled`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='工具白名单策略(13启用/9禁用,缺省拒绝)'; CREATE TABLE IF NOT EXISTS `pbl_agent_session` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `session_no` varchar(32) NOT NULL, `blueprint_id` bigint DEFAULT NULL, `agent_role` varchar(32) NOT NULL COMMENT 'designer/critic', `status` varchar(32) NOT NULL DEFAULT 'running' COMMENT 'running/finished/aborted', `goal` varchar(512) DEFAULT NULL, `turn_count` int NOT NULL DEFAULT 0, `tool_calls` int NOT NULL DEFAULT 0, `denied_calls` int NOT NULL DEFAULT 0 COMMENT 'fail-closed 拒绝次数', `result` longtext DEFAULT NULL, `start_time` datetime DEFAULT NULL, `end_time` datetime DEFAULT NULL, `create_user` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_asess_tenant_no` (`tenant_id`,`session_no`), KEY `ix_pbl_asess_tenant_bp` (`tenant_id`,`blueprint_id`,`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Agent 会话'; CREATE TABLE IF NOT EXISTS `pbl_agent_message` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `session_id` bigint NOT NULL, `seq_no` int NOT NULL COMMENT '会话内序号', `role` varchar(32) NOT NULL COMMENT 'system/user/assistant/tool', `content` longtext DEFAULT NULL, `token_in` int NOT NULL DEFAULT 0, `token_out` int NOT NULL DEFAULT 0, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_amsg_tenant_sess_seq` (`tenant_id`,`session_id`,`seq_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Agent 消息轨迹'; CREATE TABLE IF NOT EXISTS `pbl_agent_tool_call` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `session_id` bigint NOT NULL, `message_id` bigint DEFAULT NULL, `tool_name` varchar(64) NOT NULL, `verdict` varchar(32) NOT NULL COMMENT 'allow/deny', `deny_reason` varchar(255) DEFAULT NULL COMMENT 'not_in_whitelist/write_protected/missing_tenant/...', `args` longtext DEFAULT NULL, `result` longtext DEFAULT NULL, `error_code` varchar(32) DEFAULT NULL, `elapsed_ms` int NOT NULL DEFAULT 0, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `ix_pbl_atool_tenant_sess` (`tenant_id`,`session_id`,`verdict`), KEY `ix_pbl_atool_tenant_tool` (`tenant_id`,`tool_name`,`verdict`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='工具调用裁决审计(fail-closed 全量留痕)'; -- ----------------------------------------------------------------------------- -- M5a/M5b pbl_evidence —— 产出物与证据幂等采集(3 表) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_artifact` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `artifact_no` varchar(32) NOT NULL COMMENT '产出物编号', `blueprint_id` bigint DEFAULT NULL, `session_id` bigint DEFAULT NULL COMMENT '运行时会话(scense_runtime)', `team_id` varchar(32) DEFAULT NULL, `student_id` varchar(32) DEFAULT NULL, `artifact_type` varchar(32) NOT NULL COMMENT '类型编码', `name` varchar(128) NOT NULL, `content` longtext DEFAULT NULL, `file_path` varchar(255) DEFAULT NULL, `content_hash` varchar(64) NOT NULL COMMENT '幂等键之一', `idempotent_key` varchar(64) NOT NULL COMMENT '幂等键(tenant+source+hash)', `source` varchar(32) NOT NULL DEFAULT 'runtime' COMMENT 'runtime/upload/agent/compile', `status` varchar(32) NOT NULL DEFAULT 'collected', `collect_time` datetime DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_arti_tenant_idem` (`tenant_id`,`idempotent_key`), KEY `ix_pbl_arti_tenant_bp` (`tenant_id`,`blueprint_id`,`artifact_type`), KEY `ix_pbl_arti_tenant_team` (`tenant_id`,`team_id`,`student_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='产出物(幂等采集)'; CREATE TABLE IF NOT EXISTS `pbl_evidence_event` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `artifact_id` bigint DEFAULT NULL, `session_id` bigint DEFAULT NULL, `event_type` varchar(32) NOT NULL COMMENT '事件类型编码', `event_time` datetime NOT NULL, `actor_id` varchar(32) DEFAULT NULL, `payload` longtext DEFAULT NULL, `content_hash` varchar(64) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `ix_pbl_eev_tenant_arti` (`tenant_id`,`artifact_id`), KEY `ix_pbl_eev_tenant_sess_time` (`tenant_id`,`session_id`,`event_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='证据事件流'; CREATE TABLE IF NOT EXISTS `pbl_evidence_file` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `artifact_id` bigint NOT NULL, `file_name` varchar(255) NOT NULL, `file_path` varchar(255) NOT NULL, `mime_type` varchar(64) DEFAULT NULL, `size_bytes` bigint NOT NULL DEFAULT 0, `content_hash` varchar(64) NOT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_efile_tenant_arti_hash` (`tenant_id`,`artifact_id`,`content_hash`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='证据附件'; -- ----------------------------------------------------------------------------- -- M6 pbl_assessment —— Rubric 加权评估与报告(3 表) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_rubric` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `code` varchar(32) NOT NULL, `name` varchar(128) NOT NULL, `blueprint_id` bigint DEFAULT NULL, `total_weight` int NOT NULL DEFAULT 100, `status` varchar(32) NOT NULL DEFAULT 'draft', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_rubric_tenant_code` (`tenant_id`,`code`), KEY `ix_pbl_rubric_tenant_bp` (`tenant_id`,`blueprint_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='评估量规'; CREATE TABLE IF NOT EXISTS `pbl_rubric_criterion` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `rubric_id` bigint NOT NULL, `code` varchar(32) NOT NULL, `name` varchar(128) NOT NULL, `dimension` varchar(32) DEFAULT NULL, `weight` int NOT NULL DEFAULT 0 COMMENT '权重(整数,总和=100)', `max_score` int NOT NULL DEFAULT 5, `levels` longtext DEFAULT NULL COMMENT '等级描述JSON(确定性序列化)', `sort_no` int NOT NULL DEFAULT 0, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_rcrit_tenant_rubric_code` (`tenant_id`,`rubric_id`,`code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='量规评分项'; CREATE TABLE IF NOT EXISTS `pbl_assessment_report` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `report_no` varchar(32) NOT NULL, `rubric_id` bigint NOT NULL, `blueprint_id` bigint DEFAULT NULL, `team_id` varchar(32) DEFAULT NULL, `student_id` varchar(32) DEFAULT NULL, `score_total` int NOT NULL DEFAULT 0, `level` varchar(32) NOT NULL DEFAULT 'L0', `detail` longtext DEFAULT NULL COMMENT '逐项得分JSON', `evidence_ref` longtext DEFAULT NULL COMMENT '引用证据ID列表JSON', `assessor` varchar(32) DEFAULT NULL COMMENT 'teacher/agent/critic', `status` varchar(32) NOT NULL DEFAULT 'draft', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_areport_tenant_no` (`tenant_id`,`report_no`), KEY `ix_pbl_areport_tenant_team` (`tenant_id`,`team_id`,`student_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='评估报告'; -- ----------------------------------------------------------------------------- -- M7 pbl_kdb_ext —— KDB 只读桩与匿名聚合(零写入,1 表:查询留痕) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_kdb_query_log` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `query_no` varchar(32) NOT NULL, `kdb_key` varchar(64) NOT NULL COMMENT '知识点/知识图谱键', `scope` varchar(32) NOT NULL DEFAULT 'read' COMMENT '只允许 read', `anonymized` tinyint NOT NULL DEFAULT 1 COMMENT '是否匿名聚合', `result_count` int NOT NULL DEFAULT 0, `caller` varchar(32) DEFAULT NULL, `elapsed_ms` int NOT NULL DEFAULT 0, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_kdblog_tenant_no` (`tenant_id`,`query_no`), KEY `ix_pbl_kdblog_tenant_key` (`tenant_id`,`kdb_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KDB只读查询留痕(零写入基表)'; -- ----------------------------------------------------------------------------- -- M8 pbl_domain_ext —— world/scene/entity 薄扩展(不改基表,3 表) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_world_ext` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `world_id` bigint NOT NULL COMMENT 'world.id(只读引用,无FK)', `blueprint_id` bigint DEFAULT NULL, `class_id` varchar(32) DEFAULT NULL COMMENT '班级', `team_id` varchar(32) DEFAULT NULL COMMENT '团队', `ext` longtext DEFAULT NULL COMMENT '扩展属性JSON', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_wext_tenant_world` (`tenant_id`,`world_id`), KEY `ix_pbl_wext_tenant_class_team` (`tenant_id`,`class_id`,`team_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='world 薄扩展(租户/班级/团队关联)'; CREATE TABLE IF NOT EXISTS `pbl_scene_ext` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `scene_id` bigint NOT NULL COMMENT 'scene.id(只读引用)', `blueprint_id` bigint DEFAULT NULL, `class_id` varchar(32) DEFAULT NULL, `team_id` varchar(32) DEFAULT NULL, `ext` longtext DEFAULT NULL, `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_sext_tenant_scene` (`tenant_id`,`scene_id`), KEY `ix_pbl_sext_tenant_class_team` (`tenant_id`,`class_id`,`team_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='scene 薄扩展'; CREATE TABLE IF NOT EXISTS `pbl_entity_ext` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `entity_id` bigint NOT NULL COMMENT 'entity.id(只读引用)', `blueprint_id` bigint DEFAULT NULL, `class_id` varchar(32) DEFAULT NULL, `team_id` varchar(32) DEFAULT NULL, `role_code` varchar(32) DEFAULT NULL COMMENT '对应 pbl_sub_role.code', `ext` longtext DEFAULT NULL, `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_eext_tenant_entity` (`tenant_id`,`entity_id`), KEY `ix_pbl_eext_tenant_class_team` (`tenant_id`,`class_id`,`team_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='entity 薄扩展'; -- ----------------------------------------------------------------------------- -- M11a/M11b pbl_runtime_ext —— 单事务事件+状态写入与广播登记(2 表) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_runtime_event` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `event_uid` varchar(64) NOT NULL COMMENT '事件唯一ID(幂等键)', `session_id` bigint NOT NULL COMMENT 'scense_runtime 会话(只读引用)', `world_id` bigint DEFAULT NULL, `event_type` varchar(32) NOT NULL, `source_id` varchar(32) DEFAULT NULL, `target_id` varchar(32) DEFAULT NULL, `payload` longtext DEFAULT NULL, `tx_group` varchar(64) NOT NULL COMMENT '单事务分组ID(事件+状态+广播同组)', `seq_no` bigint NOT NULL DEFAULT 0 COMMENT '会话内单调序号(重放依据)', `applied` tinyint NOT NULL DEFAULT 0 COMMENT '是否已应用状态', `broadcast_state` varchar(32) NOT NULL DEFAULT 'pending' COMMENT 'pending/sent/failed', `event_time` datetime NOT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_rev_tenant_uid` (`tenant_id`,`event_uid`), KEY `ix_pbl_rev_tenant_sess_seq` (`tenant_id`,`session_id`,`seq_no`), KEY `ix_pbl_rev_tenant_tx` (`tenant_id`,`tx_group`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='运行时事件(单事务写入+可重放)'; CREATE TABLE IF NOT EXISTS `pbl_runtime_state` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `session_id` bigint NOT NULL, `state_key` varchar(64) NOT NULL COMMENT '状态键(entity/scene/global)', `state_value` longtext DEFAULT NULL COMMENT '状态值JSON', `version` bigint NOT NULL DEFAULT 0 COMMENT '乐观锁版本', `last_event_id` bigint DEFAULT NULL COMMENT '最后应用事件ID', `tx_group` varchar(64) DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_rstate_tenant_sess_key` (`tenant_id`,`session_id`,`state_key`), KEY `ix_pbl_rstate_tenant_tx` (`tenant_id`,`tx_group`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='运行时状态(与事件同事务写入)'; -- ----------------------------------------------------------------------------- -- M12 pbl_template —— 模板实例化记录(1 表) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_template_instance` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `template_id` bigint NOT NULL COMMENT 'pbl_blueprint_template.id', `blueprint_id` bigint NOT NULL COMMENT '实例化产生的蓝图', `params` longtext DEFAULT NULL COMMENT '实例化参数JSON', `mode` varchar(32) NOT NULL DEFAULT 'online' COMMENT 'online/offline(离线兜底)', `status` varchar(32) NOT NULL DEFAULT 'created', `create_user` varchar(32) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_tinst_tenant_tpl_bp` (`tenant_id`,`template_id`,`blueprint_id`), KEY `ix_pbl_tinst_tenant_status` (`tenant_id`,`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板实例化记录'; -- ----------------------------------------------------------------------------- -- M13 pbl_analytics —— 学习分析快照与指标(2 表) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_analytics_metric` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `metric_code` varchar(32) NOT NULL, `scope` varchar(32) NOT NULL DEFAULT 'student' COMMENT 'student/team/class/blueprint', `scope_id` varchar(32) NOT NULL, `blueprint_id` bigint DEFAULT NULL, `value_num` decimal(18,4) NOT NULL DEFAULT 0, `value_text` varchar(255) DEFAULT NULL, `stat_date` datetime NOT NULL COMMENT '统计时点(datetime,非TIMESTAMP)', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_ametric_tenant_code_scope_date` (`tenant_id`,`metric_code`,`scope`,`scope_id`,`stat_date`), KEY `ix_pbl_ametric_tenant_bp` (`tenant_id`,`blueprint_id`,`metric_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='分析指标明细'; CREATE TABLE IF NOT EXISTS `pbl_analytics_snapshot` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `snapshot_no` varchar(32) NOT NULL, `blueprint_id` bigint DEFAULT NULL, `class_id` varchar(32) DEFAULT NULL, `period` varchar(32) DEFAULT NULL, `content` longtext DEFAULT NULL COMMENT '聚合结果JSON(匿名化)', `content_hash` varchar(64) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_asnap_tenant_no` (`tenant_id`,`snapshot_no`), KEY `ix_pbl_asnap_tenant_bp_class` (`tenant_id`,`blueprint_id`,`class_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='分析快照'; -- ----------------------------------------------------------------------------- -- M14 pbl_governance —— 治理与审计(append-only,1 表) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_audit_log` ( `tenant_id` varchar(32) NOT NULL, `id` bigint NOT NULL AUTO_INCREMENT, `trace_id` varchar(64) NOT NULL COMMENT '链路追踪ID', `actor_role` varchar(32) NOT NULL COMMENT 'owner.audit/teacher/agent.designer/agent.critic', `actor_id` varchar(32) DEFAULT NULL, `action` varchar(64) NOT NULL COMMENT '动作', `object_type` varchar(32) DEFAULT NULL, `object_id` varchar(64) DEFAULT NULL, `result` varchar(32) NOT NULL DEFAULT 'success' COMMENT 'success/denied/error', `error_code` varchar(32) DEFAULT NULL, `detail` longtext DEFAULT NULL, `client_ip` varchar(64) DEFAULT NULL, `log_time` datetime NOT NULL, PRIMARY KEY (`id`), KEY `ix_pbl_audit_tenant_time` (`tenant_id`,`log_time`), KEY `ix_pbl_audit_tenant_trace` (`tenant_id`,`trace_id`), KEY `ix_pbl_audit_tenant_obj` (`tenant_id`,`object_type`,`object_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='治理审计日志(append-only,owner.audit 独立角色,禁自删)'; -- ============================================================================= -- 表清单(36): -- pbl_blueprint(11): pbl_blueprint, pbl_blueprint_version, pbl_blueprint_template, -- pbl_sub_world, pbl_sub_scene, pbl_sub_role, pbl_sub_task, -- pbl_sub_rule, pbl_sub_artifact, pbl_sub_assessment, pbl_sub_link -- pbl_validation(3): pbl_validation_rule, pbl_validation_run, pbl_validation_issue -- pbl_compiler(3): pbl_compile_job, pbl_compile_artifact, pbl_game_definition -- pbl_agent_runtime(4): pbl_agent_tool_policy, pbl_agent_session, pbl_agent_message, pbl_agent_tool_call -- pbl_evidence(3): pbl_artifact, pbl_evidence_event, pbl_evidence_file -- pbl_assessment(3): pbl_rubric, pbl_rubric_criterion, pbl_assessment_report -- pbl_kdb_ext(1): pbl_kdb_query_log -- pbl_domain_ext(3): pbl_world_ext, pbl_scene_ext, pbl_entity_ext -- pbl_runtime_ext(2):pbl_runtime_event, pbl_runtime_state -- pbl_template(1): pbl_template_instance -- pbl_analytics(2): pbl_analytics_metric, pbl_analytics_snapshot -- pbl_governance(1): pbl_audit_log -- 合计 11+3+3+4+3+3+1+3+2+1+2+1 = 37 声明位(其中 pbl_sub_link 为关系边表, -- 计入 blueprint 域 11 表内),业务表总计 36(pbl_common / pbl_appcodes 零表)。 -- =============================================================================