-- pbl_blueprint DDL (MariaDB / MySQL) -- 由 models/*.json 派生(json2ddl mysql . 等价输出),tenant_id 强制打头。 -- 部署:应用 build.sh 执行 json2ddl 生成;本文件为可核对的落库基线。 CREATE TABLE IF NOT EXISTS `pbl_blueprint` ( `id` VARCHAR(32) NOT NULL COMMENT '主键', `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '租户ID(强制打头)', `org_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '所属机构', `blueprint_code` VARCHAR(64) NOT NULL COMMENT '蓝图编码', `title` VARCHAR(255) NOT NULL COMMENT '蓝图标题', `subject_area` VARCHAR(64) DEFAULT '' COMMENT '学科领域', `grade_level` VARCHAR(32) DEFAULT '' COMMENT '适用年级', `duration_hours` INT DEFAULT 0 COMMENT '总课时(小时)', `driving_question` TEXT COMMENT '驱动问题', `summary` TEXT COMMENT '蓝图摘要', `quality_status` VARCHAR(32) NOT NULL DEFAULT 'draft' COMMENT '5级质量状态', `validation_score` DECIMAL(5,2) DEFAULT 0 COMMENT '校验得分', `version_no` INT NOT NULL DEFAULT 1 COMMENT '当前版本号', `current_version_id` VARCHAR(32) DEFAULT '' COMMENT '当前版本ID', `template_id` VARCHAR(32) DEFAULT '' COMMENT '来源模板ID', `forked_from_id` VARCHAR(32) DEFAULT '' COMMENT '派生自蓝图ID', `status` VARCHAR(32) NOT NULL DEFAULT 'draft' COMMENT 'draft/published/archived/deleted', `extra_json` LONGTEXT COMMENT '扩展属性JSON', `created_by` VARCHAR(32) DEFAULT '', `created_at` DATETIME NOT NULL, `updated_by` VARCHAR(32) DEFAULT '', `updated_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_blueprint_code` (`tenant_id`,`blueprint_code`), KEY `idx_pbl_blueprint_tenant` (`tenant_id`,`status`), KEY `idx_pbl_blueprint_org` (`org_id`), KEY `idx_pbl_blueprint_created` (`tenant_id`,`created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='PBL蓝图聚合根'; CREATE TABLE IF NOT EXISTS `pbl_blueprint_learning_goal` ( `id` VARCHAR(32) NOT NULL, `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0', `blueprint_id` VARCHAR(32) NOT NULL, `seq` INT NOT NULL DEFAULT 0, `goal_code` VARCHAR(64) NOT NULL, `title` VARCHAR(255) NOT NULL, `description` TEXT, `knowledge_type` VARCHAR(32) DEFAULT 'concept', `competency_tags` TEXT, `assessable` VARCHAR(1) DEFAULT '1', `alignment_json` LONGTEXT, `created_by` VARCHAR(32) DEFAULT '', `created_at` DATETIME NOT NULL, `updated_by` VARCHAR(32) DEFAULT '', `updated_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_goal_code` (`tenant_id`,`blueprint_id`,`goal_code`), KEY `idx_pbl_goal_bp` (`tenant_id`,`blueprint_id`,`seq`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蓝图子对象-学习目标'; CREATE TABLE IF NOT EXISTS `pbl_blueprint_role` ( `id` VARCHAR(32) NOT NULL, `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0', `blueprint_id` VARCHAR(32) NOT NULL, `seq` INT NOT NULL DEFAULT 0, `role_code` VARCHAR(64) NOT NULL, `role_name` VARCHAR(128) NOT NULL, `description` TEXT, `responsibilities` TEXT, `required_skills` TEXT, `min_members` INT DEFAULT 1, `max_members` INT DEFAULT 1, `is_mandatory` VARCHAR(1) DEFAULT '0', `created_by` VARCHAR(32) DEFAULT '', `created_at` DATETIME NOT NULL, `updated_by` VARCHAR(32) DEFAULT '', `updated_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_role_code` (`tenant_id`,`blueprint_id`,`role_code`), KEY `idx_pbl_role_bp` (`tenant_id`,`blueprint_id`,`seq`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蓝图子对象-PBL角色'; CREATE TABLE IF NOT EXISTS `pbl_blueprint_mission` ( `id` VARCHAR(32) NOT NULL, `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0', `blueprint_id` VARCHAR(32) NOT NULL, `seq` INT NOT NULL DEFAULT 0, `mission_code` VARCHAR(64) NOT NULL, `title` VARCHAR(255) NOT NULL, `driving_question` TEXT, `narrative` LONGTEXT, `success_criteria` TEXT, `related_goal_ids` TEXT, `duration_hours` INT DEFAULT 0, `created_by` VARCHAR(32) DEFAULT '', `created_at` DATETIME NOT NULL, `updated_by` VARCHAR(32) DEFAULT '', `updated_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_mission_code` (`tenant_id`,`blueprint_id`,`mission_code`), KEY `idx_pbl_mission_bp` (`tenant_id`,`blueprint_id`,`seq`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蓝图子对象-驱动问题/Mission'; CREATE TABLE IF NOT EXISTS `pbl_blueprint_task` ( `id` VARCHAR(32) NOT NULL, `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0', `blueprint_id` VARCHAR(32) NOT NULL, `mission_id` VARCHAR(32) DEFAULT '', `seq` INT NOT NULL DEFAULT 0, `task_code` VARCHAR(64) NOT NULL, `title` VARCHAR(255) NOT NULL, `description` TEXT, `task_type` VARCHAR(32) DEFAULT 'explore', `role_id` VARCHAR(32) DEFAULT '', `depends_on_ids` TEXT, `estimated_minutes` INT DEFAULT 0, `artifact_spec_ids` TEXT, `status` VARCHAR(32) DEFAULT 'draft', `created_by` VARCHAR(32) DEFAULT '', `created_at` DATETIME NOT NULL, `updated_by` VARCHAR(32) DEFAULT '', `updated_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_task_code` (`tenant_id`,`blueprint_id`,`task_code`), KEY `idx_pbl_task_bp` (`tenant_id`,`blueprint_id`,`seq`), KEY `idx_pbl_task_mission` (`tenant_id`,`mission_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蓝图子对象-任务'; CREATE TABLE IF NOT EXISTS `pbl_blueprint_artifact_spec` ( `id` VARCHAR(32) NOT NULL, `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0', `blueprint_id` VARCHAR(32) NOT NULL, `task_id` VARCHAR(32) DEFAULT '', `seq` INT NOT NULL DEFAULT 0, `artifact_code` VARCHAR(64) NOT NULL, `name` VARCHAR(255) NOT NULL, `artifact_type` VARCHAR(32) DEFAULT 'document', `format` VARCHAR(64) DEFAULT '', `description` TEXT, `required` VARCHAR(1) DEFAULT '1', `max_size_mb` INT DEFAULT 0, `schema_json` LONGTEXT, `rubric_id` VARCHAR(32) DEFAULT '', `created_by` VARCHAR(32) DEFAULT '', `created_at` DATETIME NOT NULL, `updated_by` VARCHAR(32) DEFAULT '', `updated_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_artifact_code` (`tenant_id`,`blueprint_id`,`artifact_code`), KEY `idx_pbl_artifact_bp` (`tenant_id`,`blueprint_id`,`seq`), KEY `idx_pbl_artifact_task` (`tenant_id`,`task_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蓝图子对象-产出物规格'; CREATE TABLE IF NOT EXISTS `pbl_blueprint_evidence_spec` ( `id` VARCHAR(32) NOT NULL, `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0', `blueprint_id` VARCHAR(32) NOT NULL, `artifact_spec_id` VARCHAR(32) DEFAULT '', `task_id` VARCHAR(32) DEFAULT '', `seq` INT NOT NULL DEFAULT 0, `evidence_code` VARCHAR(64) NOT NULL, `name` VARCHAR(255) NOT NULL, `evidence_type` VARCHAR(32) DEFAULT 'result', `collect_mode` VARCHAR(32) DEFAULT 'auto', `source_hint` VARCHAR(255) DEFAULT '', `idempotency_key_hint` VARCHAR(128) DEFAULT '', `required` VARCHAR(1) DEFAULT '1', `description` TEXT, `created_by` VARCHAR(32) DEFAULT '', `created_at` DATETIME NOT NULL, `updated_by` VARCHAR(32) DEFAULT '', `updated_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_evidence_code` (`tenant_id`,`blueprint_id`,`evidence_code`), KEY `idx_pbl_evidence_bp` (`tenant_id`,`blueprint_id`,`seq`), KEY `idx_pbl_evidence_artifact` (`tenant_id`,`artifact_spec_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蓝图子对象-证据规格'; CREATE TABLE IF NOT EXISTS `pbl_blueprint_reflection_spec` ( `id` VARCHAR(32) NOT NULL, `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0', `blueprint_id` VARCHAR(32) NOT NULL, `seq` INT NOT NULL DEFAULT 0, `reflection_code` VARCHAR(64) NOT NULL, `title` VARCHAR(255) NOT NULL, `prompt` TEXT, `reflection_type` VARCHAR(32) DEFAULT 'self', `trigger_point` VARCHAR(64) DEFAULT 'task_end', `required` VARCHAR(1) DEFAULT '1', `rubric_hint` TEXT, `created_by` VARCHAR(32) DEFAULT '', `created_at` DATETIME NOT NULL, `updated_by` VARCHAR(32) DEFAULT '', `updated_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_reflection_code` (`tenant_id`,`blueprint_id`,`reflection_code`), KEY `idx_pbl_reflection_bp` (`tenant_id`,`blueprint_id`,`seq`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蓝图子对象-反思规格'; CREATE TABLE IF NOT EXISTS `pbl_blueprint_version` ( `id` VARCHAR(32) NOT NULL, `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0', `blueprint_id` VARCHAR(32) NOT NULL, `version_no` INT NOT NULL DEFAULT 1, `parent_version_id` VARCHAR(32) DEFAULT '', `change_delta` LONGTEXT COMMENT '{op,path,before,after} 列表', `snapshot_json` LONGTEXT, `change_reason` VARCHAR(500) DEFAULT '', `source` VARCHAR(32) DEFAULT 'manual', `quality_status` VARCHAR(32) DEFAULT 'draft', `created_by` VARCHAR(32) DEFAULT '', `created_at` DATETIME NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_version_no` (`tenant_id`,`blueprint_id`,`version_no`), KEY `idx_pbl_version_bp` (`tenant_id`,`blueprint_id`,`created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蓝图版本(change_delta 证明对话式改模型)'; CREATE TABLE IF NOT EXISTS `pbl_template` ( `id` VARCHAR(32) NOT NULL, `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '0=平台内置全局模板', `template_code` VARCHAR(64) NOT NULL, `name` VARCHAR(255) NOT NULL, `description` TEXT, `category` VARCHAR(64) DEFAULT 'general', `subject_area` VARCHAR(64) DEFAULT '', `grade_level` VARCHAR(32) DEFAULT '', `blueprint_snapshot` LONGTEXT, `offline_slots` LONGTEXT COMMENT 'LLM 不可用时降级填充槽位', `is_builtin` VARCHAR(1) DEFAULT '0', `template_version` VARCHAR(32) DEFAULT '1.0.0', `status` VARCHAR(32) DEFAULT 'active', `created_by` VARCHAR(32) DEFAULT '', `created_at` DATETIME NOT NULL, `updated_by` VARCHAR(32) DEFAULT '', `updated_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_template_code` (`tenant_id`,`template_code`), KEY `idx_pbl_template_cat` (`tenant_id`,`category`,`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='PBL模板(含离线兜底槽位)';