70 lines
3.1 KiB
Markdown
70 lines
3.1 KiB
Markdown
# pbl_blueprint — 蓝图聚合根(T04,★高风险件)
|
||
|
||
11 表 + **7 类子对象泛化契约** + 版本/change_delta + fork + 模板实例化 + 编辑锁。
|
||
|
||
## 11 表
|
||
|
||
`pbl_blueprint` · `pbl_blueprint_version` · `pbl_change_delta` · `pbl_subobject` ·
|
||
`pbl_subobject_field` · `pbl_subobject_rel` · `pbl_blueprint_lock` ·
|
||
`pbl_blueprint_fork` · `pbl_blueprint_ref` · `pbl_blueprint_status_log` ·
|
||
`pbl_blueprint_template`
|
||
|
||
## 7 类子对象(泛化单表,非 7 张分表)
|
||
|
||
| obj_type | 语义 | payload 必填字段 |
|
||
|----------|------|------------------|
|
||
| `learning_goal` | 学习目标 | statement |
|
||
| `task` | 任务/关卡 | objective |
|
||
| `role` | 角色 | — |
|
||
| `artifact` | 产出物 | kind(枚举 `pbl_evidence_kind`) |
|
||
| `rubric` | 评价量规 | criteria |
|
||
| `resource` | 资源 | uri |
|
||
| `rule` | 规则 | condition, action |
|
||
|
||
**泛化机制**:`pbl_subobject` 单表 + `obj_type` 判别 + `payload`(longtext JSON) 承载差异字段;
|
||
`pbl_subobject_field` 存字段元数据(tenant_id='' 为平台内置),驱动 payload 校验与前端表单;
|
||
DB 无元数据时回落 `subobject.BUILTIN_SCHEMA`(离线兜底)。
|
||
|
||
**统一契约**(7 类共用,禁止每类单开 API):
|
||
```python
|
||
list_subobjects(tenant_id, blueprint_id, obj_type=None, parent_id=None)
|
||
get_subobject(tenant_id, subobject_id)
|
||
upsert_subobject(tenant_id, blueprint_id, obj_type, name, payload=..., subobject_id=None)
|
||
delete_subobject(tenant_id, subobject_id, cascade=True)
|
||
reorder_subobject(tenant_id, blueprint_id, obj_type, ordered_ids)
|
||
get_tree(tenant_id, blueprint_id) # 供 T05 校验 / T06 编译消费
|
||
validate_payload(tenant_id, obj_type, payload, strict=True)
|
||
add_rel / list_rels / delete_rel # 跨类型连线(aligns_to/produces/assesses...)
|
||
```
|
||
|
||
## 版本与 change_delta
|
||
|
||
`commit_version()` → 确定性序列化(`sort_keys=True` + 紧凑分隔符,**不含时间戳**)→ sha256 →
|
||
写 `pbl_blueprint_version` 快照 → 与上一版比对生成 `pbl_change_delta`(added/modified/removed)。
|
||
确定性序列化是 T06 `pbl_compiler` 幂等编译的前提。
|
||
|
||
`rollback_version()` 不改历史:软删现有子对象 → 按快照重建 → 提交为**新版本**。
|
||
|
||
## fork
|
||
|
||
`fork_blueprint(mode='deep')` 深拷贝聚合根 + 全部子对象(按 parent 拓扑序重建 idmap)+ 关系 + 外部引用,
|
||
写 `pbl_blueprint_fork` 溯源;`get_fork_lineage()` 双向溯源。
|
||
|
||
## C4 写保护
|
||
|
||
`add_ref()` 只把 world/scene/entity/kdb/script 的 **ID + 快照** 存进 `pbl_blueprint_ref`,
|
||
模块内**不存在任何对写保护域基表的 C/U/D 调用**。快照保证外部变更不影响蓝图。
|
||
|
||
## 状态机
|
||
|
||
```
|
||
draft ⇄ in_review → approved → published → archived
|
||
└──────────────────────────────────────────┘(archived 可回 draft)
|
||
```
|
||
非法流转 → `PBL-CONFLICT-0001`。质量级 5 级严格递进,**禁止跳级上升**(`PBL-VALID-0002`)。
|
||
|
||
## 并发
|
||
|
||
`acquire_lock/release_lock` + 子对象 `version_no` 乐观锁;
|
||
`upsert_subobject` 更新时带 `extra_where=[('version_no','=',旧值)]`,不匹配即冲突。
|