--- name: scene description: scene 模块技能文档——场景管理(场景表 CRUD + 场景导入)。提供 scene/scene_import 两张表、CRUD、列表查询接口、文件导入(api/scene_import.dspy),通过 load_scene() 挂载。枚举字段用 appcodes 字典(cond parentid=)。 --- # scene 模块 ## 概述 场景管理,含场景导入。依赖 world(world_id 外键)、appbase(appcodes 字典)、rbac(权限)。 ## 数据模型 ### 表 `scene`(models/scene.json) | 字段 | 类型 | 说明 | |------|------|------| | id | str(32) | 主键 | | world_id | str(32) | 所属世界(→world.id) | | name | str(255) | 场景名称 | | code | str(64) | 场景编码(唯一) | | description | text | 描述 | | scene_type | str(16) | 场景类型(appcodes scene_type,默认 '0') | | status | str(16) | 状态(appcodes scene_status,默认 '0') | | config_json | text | 场景配置 JSON | | created_at | timestamp | 创建时间 | | updated_at | timestamp | 更新时间 | - 主键 `["id"]`;唯一索引 `idx_scene_code(code)`;索引 `idx_scene_world(world_id)` - 字典:world_id → world(id/name)、scene_type → appcodes_kv(parentid='scene_type')、status → appcodes_kv(parentid='scene_status') ### 表 `scene_import`(models/scene_import.json) | 字段 | 类型 | 说明 | |------|------|------| | id | str(32) | 主键 | | world_id | str(32) | 目标世界 | | file_name | str(255) | 导入文件名 | | total | int | 总条数(默认 0) | | success | int | 成功条数(默认 0) | | fail | int | 失败条数(默认 0) | | status | str(16) | 导入状态(appcodes import_status,默认 '0') | | created_at | timestamp | 导入时间 | - 主键 `["id"]`;索引 `idx_scene_import_world(world_id)` - 字典:world_id → world、status → appcodes_kv(parentid='import_status') ## 关键接口 ### ServerEnv 注册函数(load_scene() 挂载) - `list_scenes(params)` → `[{value:id, text:name}]` - `get_scene({id})` → 单条 - `create_scene(ns)` → 自动生成 id/code、写 created_at - `update_scene(ns)` → 写 updated_at、剔除 `_text` 后缀 - `delete_scene({id})` - `import_scenes({world_id, file_name, rows})` → `{success, total, success_count, fail}` - `parse_scene_file(content, filename)` → `[{...}]`(JSON 数组 / JSON Lines / CSV) - `get_world_options()` / `get_scene_type_options()` / `get_scene_status_options()` → `[{value, text}]` ### wwwroot/api/*.dspy - `list_scenes.dspy`、`create_scene.dspy`、`scene_update.dspy`、`scene_delete.dspy` - `get_search_world_id.dspy` / `get_search_scene_type.dspy` / `get_search_status.dspy`:字典下拉 - `scene_import.dspy`:场景导入(world_id + file → parse_scene_file → import_scenes) ## 陷阱 - 库名禁止硬编码:.py 用 `ServerEnv().get_module_dbname("scene")`,.dspy 用 `get_module_dbname("scene")`(全局) - world 下拉用 `ServerEnv().get_module_dbname("world")`(world 表在 world 模块库) - dspy 无 import(json/get_sor_context/debug/params_kw 均为预加载全局) - `create_scene` 必须设置 `created_at = curDateString()`,否则 sor.C 静默丢记录 - 导入时 `scene_import` 记录必须设置 `created_at`,字段 total/success/fail 为 int - `import_scenes` 返回用 `success_count` 表示成功条数(避免与布尔 `success` 键冲突) - CRUD json `new_data_url` 指向自定义 `api/create_scene.dspy`;scene_import 为只读列表,无 editable ## 依赖 - world(world_id 外键 + 世界下拉)、appbase(appcodes 字典)、rbac(权限)