chengkai3
|
23db30d0f0
|
fix: [FL-199][拆分用户创建错误消息以明确失败原因]
将模糊的 409 错误消息 "User id/email/username already exists or default role missing"
拆分为三种具体的异常类型:
1. UserDuplicateError (409) - 用户ID/邮箱/用户名已存在
2. UserRoleAssignmentError (500) - 默认角色未配置或角色分配失败
3. UserCreateError (500) - 其他用户创建失败
改动内容:
- 在 user_service.py 中定义三个异常类
- 将 create_user 返回类型从 UserPublic | None 改为 UserPublic(抛出异常)
- 在 API 层捕获具体异常并返回对应的 HTTP 状态码和明确错误消息
- 更新和新增测试以验证错误消息准确性
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-18 13:13:51 +08:00 |
|
chengkai3
|
e67475aad6
|
[fix]:[FL-198][菜单管理 - 创建失败且错误信息不明确]
## 改动摘要
- 新增自定义异常类用于菜单验证错误的精确识别
- 修改 create_menu 服务函数,使用异常替代返回 None
- 修改 API 端点捕获异常并返回详细错误信息
## 详细改动
### 1. 新增异常类 (api/app/exceptions/menu_exceptions.py)
创建了以下异常类以区分不同的验证失败场景:
- `MenuValidationError`: 基础菜单验证异常类
- `EmptyMenuCodeError`: 菜单编码为空
- `EmptyMenuNameError`: 菜单名称为空
- `DuplicateMenuCodeError`: 菜单编码重复
- `RemovedMenuCodeError`: 使用已移除的菜单编码
- `SelfParentError`: 菜单将自己设为父菜单
- `ParentNotFoundError`: 父菜单不存在
### 2. 修改服务层 (api/app/services/legacy_admin_rbac_service.py)
- 在 create_menu 函数中,将所有返回 None 的地方替换为抛出对应的异常
- 为数据库异常添加更具体的错误上下文
- 修改返回类型从 `MenuPublic | None` 为 `MenuPublic`
### 3. 修改 API 端点 (api/app/api/v1/admin.py)
- 在 create_menu_endpoint 中捕获 MenuValidationError 异常
- 返回详细的错误信息,包括具体的字段名(如有)
- 替换原来的模糊错误信息"Invalid menu payload or duplicate menu code"
## 测试验证
- 已通过 Python 语法检查
- 所有修改的文件编译通过
- 异常类可以正常导入
## 解决的问题
修复了 Issue FL-198 中描述的问题:
- 之前:所有创建失败都返回同一个模糊错误"Invalid menu payload or duplicate menu code"
- 现在:返回具体的错误原因,如"菜单编码 'xxx' 已存在 (字段: code)"、"父菜单 'xxx' 不存在 (字段: parent_id)"等
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-18 12:43:37 +08:00 |
|
chengkai3
|
96f83923f6
|
fix:[FL-197][角色管理 - 修复数据库表 user_role 不存在错误]
修复角色创建功能在使用现代表结构(roles)时因硬编码查询 user_role 表而导致的数据库错误。
问题分析:
- admin.py:72 直接硬编码查询 user_role 表检查角色是否存在
- legacy_admin_rbac_service.py:201 也硬编码查询 user_role 表
- 实际项目使用的是现代表结构 roles(定义在 rbac.py)
- 导致 psycopg.errors.UndefinedTable: relation "user_role" does not exist
修复方案:
1. 移除 admin.py 中的硬编码表查询,将重复检查逻辑委托给 create_role 服务函数
2. 在 create_role 函数中添加 role_source 检测逻辑
3. 根据检测结果使用正确的表名(user_role 或 roles)和字段
4. 确保 legacy 和 modern 模式下都能正常工作
影响范围:
- 角色创建功能现在支持两种表结构
- 保持向后兼容性(legacy 模式仍使用 user_role)
- 修复 modern 模式下的角色创建功能
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-18 12:35:32 +08:00 |
|
chengkai3
|
80cf981fdb
|
fix: [FL-195][创建用户报错] 为用户服务事务添加异常处理和回滚机制
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-18 12:26:58 +08:00 |
|
chengkai3
|
f3e5640290
|
fix:[FL-193][用户管理 - email 字段 NOT NULL 约束冲突]
修复 users.email 字段 NOT NULL 约束与前端可选表单不一致的问题。
## 改动内容
1. 添加数据库兼容性检查函数 `_ensure_user_email_nullable()`
- 检测 users.email 字段是否有 NOT NULL 约束
- 如果存在约束则自动移除,使字段变为可选
- 仅对 PostgreSQL 数据库生效
2. 在 `init_db()` 中调用该函数
- 确保应用启动时自动应用迁移
- 与现有兼容性检查函数保持一致的模式
3. 添加单元测试 `test_user_email_optional.py`
- 验证可以创建不带 email 的用户
- 验证可以创建带 email 的用户
- 验证直接使用 User 模型创建用户时 email 可为 None
## 修复方案
采用 Issue 中推荐的方案 1(数据库层面修复):
- 将 email 字段改为可选,与前端表单语义保持一致
- 用户可以选择不填写邮箱
- email 字段保持 UNIQUE 约束,但允许 NULL 值
## 相关文件
- api/app/core/database.py:523-546 - 新增兼容性检查函数
- api/app/core/database.py:586 - 在 init_db() 中调用
- api/tests/test_user_email_optional.py - 新增单元测试
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-18 11:34:22 +08:00 |
|
chengkai3
|
fa4834a9e2
|
fix:[FL-191][修复用户创建失败的数据库事务错误]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-18 11:00:38 +08:00 |
|
chengkai3
|
a332ba58ba
|
[fix]:[FL-190][系统接口中的stacktrace信息不要直接展示到页面给用户看]
- 后端:在 exception_handlers.py 添加文档注释,明确说明 stacktrace 字段仅供开发调试使用
- 前端:在 api.ts 添加 ApiErrorResponse 类型定义和文档注释,明确 readApiError 函数只提取 detail 字段展示给用户
- stacktrace 在 debug 模式下会返回给浏览器(可在开发者工具中查看),但前端不会展示到页面上
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-18 10:19:25 +08:00 |
|
chengkai3
|
3cc35c0336
|
feat: [FL-184] 添加调试模式配置以返回异常堆栈跟踪
- 在配置文件中添加 debug_mode 参数,默认值为 true
- 创建全局异常处理器,当 debug_mode 开启时返回 stacktrace 信息
- 在 .env.example 中添加 DEBUG_MODE 配置项说明
- 新增测试文件验证调试模式功能
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-18 08:39:21 +08:00 |
|
chengkai3
|
6519fee729
|
[feat]:[FL-172][用户管理页面新增用户时邮箱放最后,且不要必填]
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-18 00:34:20 +08:00 |
|
chengkai3
|
cdc0b4b054
|
feat:[FL-165][角色管理页面查询时合并角色和菜单请求]
将角色管理页面的角色和菜单两个独立API请求合并为单个请求,减少网络开销。
后端改动:
- 新增 RolesWithMenusResponse 响应模型
- 新增 list_roles_with_menus 服务函数
- 新增 GET /api/v1/admin/roles-with-menus 接口
前端改动:
- 更新 loadData 函数使用新的合并接口
- 减少从两个并发请求改为单个请求
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-18 00:05:11 +08:00 |
|
chengkai3
|
f281a1aebc
|
[fix]:[FL-168][新建角色时角色编码要加唯一性校验]
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-17 23:55:57 +08:00 |
|
chengkai3
|
dd15768623
|
feat:[FL-160][角色管理页面表单过滤改成后台查询]
- 后端API新增keyword查询参数支持角色搜索
- 在数据库层面实现基础过滤优化性能
- 前端移除客户端过滤逻辑改为调用后端API
- 添加搜索按钮和回车搜索功能
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-17 23:23:38 +08:00 |
|
chengkai3
|
9f4a121712
|
feat:[FL-156][菜单管理页面的过滤表单实时查询后台数据]
- 后端API添加keyword和status查询参数支持
- 前端改为调用后端API进行实时过滤
- 添加300ms防抖优化性能
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-17 18:41:37 +08:00 |
|
chengkai3
|
c451a20f76
|
fix:[FL-153][导入雷电分布数据改成导入地闪密度数据]
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-17 15:35:07 +08:00 |
|
chengkai3
|
3899a2345e
|
[fix]:[FL-145][系统消息要支持删除]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-16 17:44:11 +08:00 |
|
chengkai3
|
946312cb6e
|
fix:[FL-143][处理消息查看报错]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-16 17:03:18 +08:00 |
|
chengkai3
|
60d5d8e305
|
feat:[FL-139][ATP模型管理要分页]
- 在atp_model_service.py的list_models函数添加limit和offset参数
- 在atp_models.py的get_atp_model_list端点添加limit和offset查询参数
- 默认limit=100,offset=0,limit最大值500
- 保持向后兼容,不传参数时使用默认值
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-15 22:27:27 +08:00 |
|
chengkml
|
d23ac4f74c
|
Optimize S3 asset archive uploads
|
2026-06-15 19:05:43 +08:00 |
|
chengkai3
|
e03052ec8f
|
[fix]:[FL-129][修复菜单管理SQL列名映射错误]
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-15 17:06:13 +08:00 |
|
chengkai3
|
9a1bcef89c
|
[fix]:[FL-129][修复菜单管理SQL表名错误]
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-15 16:37:02 +08:00 |
|
chengkai3
|
9ba1cc4388
|
[feat]:[FL-118][增加密码错误5次禁止登录半小时功能]
- 在User模型添加failed_login_attempts和failed_login_locked_until字段
- 在database.py添加字段迁移兼容性函数_ensure_user_login_lockout_column_compatibility
- 修改auth_service.py的login_user函数实现登录锁定逻辑:
* 检查账户是否处于锁定状态
* 密码错误时递增失败计数
* 失败5次后锁定账户30分钟
* 登录成功后重置失败计数和锁定状态
- 添加单元测试test_login_lockout.py验证功能
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-14 01:07:26 +08:00 |
|
chengkml
|
2098e6797d
|
feat: restore system messages admin page
|
2026-06-14 00:41:19 +08:00 |
|
chengkai3
|
1d11bf9fc3
|
[feat]:[FL-109][增加系统消息发送功能]
- 后端:创建system_messages表模型和Schema
- 后端:实现消息创建、查询、标记已读的服务层
- 后端:新增REST API接口(需admin.system_message权限)
- 前端:完善系统消息抽屉弹窗,显示消息列表
- 前端:自动加载未读数量,支持标记已读
- 数据库:新增迁移脚本建表
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-13 23:27:29 +08:00 |
|
chengkai3
|
46e3b203d4
|
feat:[FL-111][地闪密度计算功能优化]实现电压等级自动推荐半径
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-13 23:09:44 +08:00 |
|
chengkai3
|
a77500a762
|
fix: [FL-110] 对齐雷电流幅值统计数据过滤逻辑
修改 _fit_line_current_parameters 函数,使其数据处理逻辑与参考工程保持一致:
1. 数据过滤改为取绝对值,不再过滤0值和负值
2. 返回值增加 peak_max 和 peak_min 字段
3. API 响应模型添加最大值和最小值字段
主要变更:
- api/app/services/lightning_service.py
* _fit_line_current_parameters: 数据清洗逻辑从 if item > 0 改为 abs(item)
* 返回值从 3 个增加到 5 个,新增 peak_max 和 peak_min
* prepare_line_lightning_current: 移除查询时的 > 0 过滤
* 在 extra_profile_json 和 preparation_source 中记录 peak_max/peak_min
- api/app/schemas/lightning.py
* LightningCurrentPreparationResponse: 添加 peak_max 和 peak_min 字段
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-13 23:00:24 +08:00 |
|
chengkai3
|
07735fb23f
|
feat: [FL-104][高程数据管理中文件明细要展示各个文件的坐标范围]
- 添加 ElevationDatasetFileMeta 数据库模型存储文件级别坐标范围
- 更新 API schema 和 service,返回每个文件的 bbox 信息
- 修改高程数据分析任务,遍历目录所有文件并提取坐标范围
- 前端文件明细表格新增坐标范围列
- 创建数据库迁移脚本
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-13 07:59:08 +08:00 |
|
chengkai3
|
0f5b338a93
|
fix:[FL-99][修复ATP版本上传接口响应模型不匹配导致500错误]
问题:POST /api/v1/atp/assets/{asset_id}/releases/upload 接口声明
response_model=AtpAssetReleaseDetail,但实际返回 {task_id, status} 字典,
导致FastAPI响应验证失败,返回500错误。
解决方案:
1. 新增 AtpAssetReleaseUploadResponse 响应模型,包含 task_id 和 status 字段
2. 更新接口声明使用正确的响应模型
3. 返回类型注解改为 AtpAssetReleaseUploadResponse
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-12 23:35:52 +08:00 |
|
chengkai3
|
86377f82d4
|
fix: 修复scheduled_tasks表外键约束违规错误
修复了当system作为actor_user_id时,update_user字段违反外键约束的问题。
当actor_user_id为"system"时,将create_user和update_user设置为NULL,
而不是尝试使用不存在的"system"用户ID。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-12 23:25:53 +08:00 |
|
chengkai3
|
2a5cbe474b
|
fix:[FL-92][高程数据管理预览时地形图渲染不出来] - 添加minzoom字段
修复地形图layer.json缺少minzoom字段导致Cesium无法正确加载地形的问题。
根本原因:
- Cesium地形加载需要layer.json同时包含minzoom和maxzoom字段
- 之前只有maxzoom字段,导致Cesium不知道从哪个层级开始加载地形
- 虽然瓦片数据正常(API返回200),但前端无法正确渲染三维地形
修改内容:
1. 在ElevationTerrainLayerResponse模型中添加minzoom字段(schemas/elevation.py)
2. 在地形构建代码中设置minzoom=0(services/elevation_service.py)
3. 地形瓦片的zoom level范围现在完整定义为0-6
影响:
- 已构建的地形数据需要重新触发构建任务才能生成包含minzoom的新layer.json
- 新构建的地形将自动包含minzoom字段
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-12 22:57:25 +08:00 |
|
chengkai3
|
ee1fa9b725
|
feat: [FL-88] 把ATP上传版本ZIP包动作变成异步
后端已使用 Celery 异步处理上传任务,前端需对接异步响应。
**主要改动:**
1. 前端处理异步上传响应
- 修改 saveReleaseMutation 识别后端返回的 {task_id, status} 响应
- 异步上传时显示"正在后台处理"提示,不阻塞用户操作
- 保留编辑版本的同步更新逻辑
2. 订阅 WebSocket 主题自动刷新
- 添加 useTopicSubscription 订阅 "admin.atp-assets" 主题
- 任务完成后自动刷新页面数据,无需手动刷新
3. 后端主题注册
- 在 topic_registry.py 添加 "admin.atp-assets" 主题
- 允许有 atp 权限的用户订阅该主题
**测试结果:**
- ✅ 前端类型正确处理异步和同步响应
- ✅ WebSocket 主题订阅正确配置
- ✅ 后端主题已注册并配置权限
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-12 18:52:20 +08:00 |
|
chengkai3
|
da9fd1cd3a
|
[feat]:[FL-84][ATP模型管理改造11]
1. 为AtpAsset模型增加避雷器装设组合配置项(arrester_config)
2. 将release zip上传改为异步处理
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-12 12:48:46 +08:00 |
|
chengkai3
|
c6d547a985
|
feat: 高程导入改为异步非阻塞,避免大文件上传时前端长时间等待
改动范围:
- api/app/services/elevation_service.py
- web/src/app/admin/elevation/page.tsx
改动点:
1. API 端快速返回(elevation_service.py)
- 修改 `import_dataset_data_files`:不再在请求内同步执行暂存
- 新增 `_prepare_upload_files_for_staging`:快速读取上传文件并序列化为 base64
- API 端立即创建任务并返回,文件内容暂存在 `staged_files_json`
2. Worker 端异步暂存(elevation_service.py)
- 修改 `execute_dataset_data_import_job`:从 `staged_files_json` 读取文件
- 新增 `_stage_dataset_import_job_uploads_from_serialized`:从序列化数据恢复并暂存
- Worker 负责完整的"暂存→导入→分析"流程
3. 前端阶段展示(page.tsx)
- 更新 `importJobStageLabel`:添加 "pending" 和 "staging" 阶段标签
- 用户可看到"等待执行"和"暂存文件"等阶段
关联影响:
- 数据库 `staged_files_json` 字段存储格式变更(存储序列化的文件内容)
- 任务初始状态改为 "pending",Worker 启动后变为 "staging"
技术方案:
- 采用 base64 序列化文件内容存入数据库
- 保持现有暂存目录和清理逻辑不变
- WebSocket 进度推送机制继续有效
验证:
- Python 语法检查通过
- 修改符合现有代码风格和约定
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-12 12:42:17 +08:00 |
|
chengkai3
|
4328d9fd34
|
[fix/feat]:[FL-82][ATP模型管理改造]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-11 23:45:57 +08:00 |
|
chengkai3
|
fac37ddb8d
|
[fix/feat]:[FL-81][ATP模型管理改造为资产发布制]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-11 22:39:48 +08:00 |
|
chengkai3
|
61a1954034
|
[feat]:[FL-80][高程数据导入异步并支持进度回看]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-10 15:38:10 +08:00 |
|
chengkai3
|
3a8027803c
|
[fix/feat]:[FL-77][修复杆塔高程回填任务 actor_user_id 传递]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-10 08:31:11 +08:00 |
|
chengkai3
|
2a54857fe1
|
[fix/feat]:[FL-76][高程数据导入报错]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-10 08:26:51 +08:00 |
|
chengkai3
|
2ad2405cd3
|
[fix/feat]:[FL-74][高程数据支持DEM地形瓦片预览和线路地形图]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-10 00:26:09 +08:00 |
|
chengkai3
|
f7013ff32c
|
[fix]:[FL-70][移除测试临时锁文件]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-09 12:30:27 +08:00 |
|
chengkai3
|
4ce57708b4
|
[fix]:[FL-70][删除线路时,塔杆要一起删除]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-09 12:30:27 +08:00 |
|
chengkai3
|
d7f712e3c1
|
[feat]:[FL-69][接入 legacy ATP/EGM worker 适配链路]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-09 12:28:02 +08:00 |
|
chengkai3
|
d36aeb8636
|
[feat]:[FL-65][新增定时任务管理页面]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-09 12:00:59 +08:00 |
|
chengkai3
|
f26f7859cd
|
[feat]:[FL-62][补充系统日志审计覆盖范围]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-09 11:31:00 +08:00 |
|
chengkai3
|
4e2b3dcdad
|
[fix]:[FL-57][统一计算任务到 Celery worker]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-09 08:29:10 +08:00 |
|
chengkai3
|
2a10cc62d8
|
[fix]:[FL-55][ATP模型管理和线路管理菜单冲突]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-09 00:11:58 +08:00 |
|
chengkai3
|
1adec62d6c
|
[feat]:[FL-51][ATP模型管理去掉版本管理]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-08 23:44:18 +08:00 |
|
chengkai3
|
23980a3cf3
|
[fix]:[FL-48][it looks like wine32 is missing]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-08 22:16:02 +08:00 |
|
chengkai3
|
de63459173
|
[fix]:[FL-47][把wine安装到fquiz-celery-worker中去]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-08 18:58:24 +08:00 |
|
chengkai3
|
2f0f24e137
|
[fix]:[FL-42][修正模型导入清单]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-08 12:54:00 +08:00 |
|
chengkai3
|
5a41cd4d3d
|
[fix/feat]:[FL-42][清理题库 Markdown 导题 热搜遗留模块]
Co-authored-by: multica-agent <github@multica.ai>
|
2026-06-08 12:48:12 +08:00 |
|