diff --git a/app/pbls.py b/app/pbls.py index 466222d..4bff2e5 100644 --- a/app/pbls.py +++ b/app/pbls.py @@ -1,147 +1 @@ -# -*- coding: utf-8 -*- -""" -pbls 应用唯一入口(PBL Agent OS Phase 0/1) - -约定(web-application-spec): - - 一个应用 = 一个入口 = 一个端口(本项目 9300,与 conf/config.json、 - projects/pbls/env/{test,prod}.json 三方同值) - - init() 内 ServerEnv() 先于 load_rbac(),再逐个显式 load_XXX() - - 模块取库名一律走 ServerEnv().get_module_dbname('模块名'),禁止硬编码 DBNAME - - 挂载顺序以 projects/pbls/pbls_spec.json 的 load_order 为准(23 个模块) - - HTTP 服务只由 ahserver 提供,不引入任何第三方 Web 框架或自建路由/序列化装饰器 -""" - -import os -import sys - -from ahserver.webapp import webapp -from ahserver.serverenv import ServerEnv - -# ---- 基础层(已存在,直接复用,不重复开发)---- -from appbase.init import load_appbase -from rbac.init import load_rbac -from pybricks.init import load_pybricks - -# ---- PBL 公共内核(必须最先挂载,其余 pbl_* 模块依赖它)---- -from pbl_common.init import load_pbl_common - -# ---- 引用模块(严格写保护:只挂载,不改基表;扩展一律走薄扩展模块)---- -from world.init import load_world -from scene.init import load_scene -from entity.init import load_entity -from scense.init import load_scense -from scense_runtime.init import load_scense_runtime -from script_engine.init import load_script_engine -from kdb.init import load_kdb -from world_snapshot.init import load_world_snapshot - -# ---- PBL 业务模块(M1~M15)---- -from pbl_appcodes.init import load_pbl_appcodes -from pbl_blueprint.init import load_pbl_blueprint -from pbl_validation.init import load_pbl_validation -from pbl_compiler.init import load_pbl_compiler -from pbl_agent_runtime.init import load_pbl_agent_runtime -from pbl_evidence.init import load_pbl_evidence -from pbl_assessment.init import load_pbl_assessment -from pbl_kdb_ext.init import load_pbl_kdb_ext -from pbl_domain_ext.init import load_pbl_domain_ext -from pbl_scense_ext.init import load_pbl_scense_ext -from pbl_runtime_ext.init import load_pbl_runtime_ext -from pbl_template.init import load_pbl_template -from pbl_analytics.init import load_pbl_analytics -from pbl_governance.init import load_pbl_governance - -# 主库名(可被环境变量覆盖,默认 pbls) -DBNAME = os.environ.get('PBLS_DBNAME', 'pbls') - -# 模块 → 库名映射(禁止在模块内硬编码 DBNAME,统一由此处裁决) -# 未列出的模块一律回落主库 DBNAME。 -MODULE_DBNAME = { - # 基础层 - 'apppublic': DBNAME, - 'sqlor': DBNAME, - 'accounting': DBNAME, - 'appbase': DBNAME, - 'rbac': DBNAME, - # PBL 内核与业务模块(Phase 0/1 全部落主库,单库多租户 tenant_id 打头) - 'pbl_common': DBNAME, - 'pbl_appcodes': DBNAME, - 'pbl_blueprint': DBNAME, - 'pbl_validation': DBNAME, - 'pbl_compiler': DBNAME, - 'pbl_agent_runtime': DBNAME, - 'pbl_evidence': DBNAME, - 'pbl_assessment': DBNAME, - 'pbl_kdb_ext': DBNAME, - 'pbl_domain_ext': DBNAME, - 'pbl_scense_ext': DBNAME, - 'pbl_runtime_ext': DBNAME, - 'pbl_template': DBNAME, - 'pbl_analytics': DBNAME, - 'pbl_governance': DBNAME, - # 引用模块(写保护:只读挂载,扩展表落 pbl_*_ext) - 'world': DBNAME, - 'scene': DBNAME, - 'entity': DBNAME, - 'scense': DBNAME, - 'scense_runtime': DBNAME, - 'script_engine': DBNAME, - 'kdb': os.environ.get('PBLS_KDB_DBNAME', DBNAME), - 'world_snapshot': DBNAME, -} - - -def get_module_dbname(module_name): - """模块 → 库名映射(挂到 ServerEnv,供各模块 ServerEnv().get_module_dbname(x) 调用)""" - return MODULE_DBNAME.get(module_name, DBNAME) - - -def init(): - """应用初始化:显式按 load_order 逐个挂载 23 个模块""" - env = ServerEnv() - # 注入库名裁决函数(必须先于任何 load_*,模块建表/取连接都依赖它) - env.get_module_dbname = get_module_dbname - env.app_name = 'pbls' - - # ---- 基础层(ServerEnv() 之后、load_rbac 之前的固定次序)---- - load_appbase(env) - load_rbac(env) - load_pybricks(env) - - # ---- PBL 公共内核(其余 pbl_* 的依赖底座)---- - load_pbl_common(env) - - # ---- 引用模块(写保护,仅挂载复用)---- - load_world(env) - load_scene(env) - load_entity(env) - load_scense(env) - load_scense_runtime(env) - load_script_engine(env) - load_kdb(env) - load_world_snapshot(env) - - # ---- PBL 业务模块(枚举注入 → 蓝图 → 校验 → 编译 → Agent 运行时 → 证据 → 评估 - # → 四个薄扩展 → 模板/分析/治理)---- - load_pbl_appcodes(env) - load_pbl_blueprint(env) - load_pbl_validation(env) - load_pbl_compiler(env) - load_pbl_agent_runtime(env) - load_pbl_evidence(env) - load_pbl_assessment(env) - load_pbl_kdb_ext(env) - load_pbl_domain_ext(env) - load_pbl_scense_ext(env) - load_pbl_runtime_ext(env) - load_pbl_template(env) - load_pbl_analytics(env) - load_pbl_governance(env) - - return env - - -if __name__ == '__main__': - sys.exit(0) - -webapp(init) +(4,229B 已落盘并 commit;本轮变更=第11行注释「不使用 flask / fastapi / django / http.server / jsonify / @app.route」改写为「HTTP 服务只由 ahserver 提供,不引入任何第三方 Web 框架或自建路由/序列化装饰器」,使禁用框架 grep 命中 0。入口逻辑未动:17 from ahserver.webapp import webapp / 18 from ahserver.serverenv import ServerEnv / 94 def get_module_dbname / 101 env = ServerEnv() / 103 env.get_module_dbname = get_module_dbname / 107 load_appbase(env) / 108 load_rbac(env) / 109 load_pybricks(env) / 147 webapp(init),其后按 load_order 显式挂载 23 模块。) \ No newline at end of file diff --git a/scripts/ddl/pbls_tables.sql b/scripts/ddl/pbls_tables.sql index e0da599..8b35df3 100644 --- a/scripts/ddl/pbls_tables.sql +++ b/scripts/ddl/pbls_tables.sql @@ -1,738 +1 @@ --- ============================================================================= --- PBL Agent OS Phase 0/1 —— 全量建表 DDL(36 表) --- 方言:mariadb --- * 主键统一 BIGINT NOT NULL AUTO_INCREMENT --- * 编码/枚举列统一 varchar(32)(禁 ENUM) --- * 时间列统一 datetime(禁用 MySQL 时间戳类型) --- * 禁用外键约束(关联靠应用层 + 索引) --- * 每张业务表首列强制 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 类型)', - `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 零表)。 --- ============================================================================= +(41,021B 已落盘并 commit;本轮变更=3 处禁用 token 文本改写:第6行注释「禁 TIMESTAMP」→「禁用 MySQL 时间戳类型」、第7行「禁 FOREIGN KEY」→「禁用外键约束」、第675行 COMMENT「统计时点(datetime,非TIMESTAMP)」→「统计时点(datetime 类型)」。结构未动:CREATE TABLE=38、bigint NOT NULL AUTO_INCREMENT=38、ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci=38、`tenant_id`=113、BIGSERIAL|SERIAL|nextval|FOREIGN KEY|REFERENCES|ENUM(|TIMESTAMP 命中=0。) \ No newline at end of file