- Add company module (3-tier org, CEO planning, parallel departments) - Add company orchestrator, knowledge extractor, presets, scheduler - Add company API endpoints, models, and frontend views - Add 今天吃啥 PWA app (69 dishes, real images, offline support) - Add team_projects output directory structure - Add unified manage.ps1 for service lifecycle - Add Windows startup guide v1.0 - Add TTS troubleshooting doc - Update frontend (AgentChat UX overhaul, new views) - Update backend (voice engine fix, multi-tenant, RBAC) - Remove deprecated startup scripts and old docs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
88 lines
2.6 KiB
Python
88 lines
2.6 KiB
Python
"""
|
||
公司组织班底预设包 API — 一键创建全套 AI 数字员工
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
import logging
|
||
from typing import Any, Dict, List, Optional
|
||
|
||
from fastapi import APIRouter, Depends, HTTPException, Query
|
||
from pydantic import BaseModel, Field
|
||
from sqlalchemy.orm import Session
|
||
|
||
from app.api.auth import get_current_user
|
||
from app.core.database import get_db
|
||
from app.models.user import User
|
||
from app.services.company_presets import (
|
||
list_company_presets,
|
||
get_company_preset,
|
||
create_company_preset,
|
||
)
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
router = APIRouter(
|
||
prefix="/api/v1/company-presets",
|
||
tags=["company-presets"],
|
||
responses={
|
||
401: {"description": "未授权"},
|
||
400: {"description": "请求参数错误"},
|
||
404: {"description": "预设包不存在"},
|
||
},
|
||
)
|
||
|
||
|
||
class CreateCompanyPresetRequest(BaseModel):
|
||
workspace_id: Optional[str] = Field(None, description="工作区 ID")
|
||
selected_roles: Optional[List[str]] = Field(None, description="要创建的角色 role key 列表,不传则创建全部")
|
||
|
||
|
||
@router.get("")
|
||
def list_presets(
|
||
_current_user: User = Depends(get_current_user),
|
||
):
|
||
"""获取所有可用行业预设包列表(含角色预览,不含完整 prompt)。"""
|
||
presets = list_company_presets()
|
||
return {"presets": presets, "total": len(presets)}
|
||
|
||
|
||
@router.get("/{preset_type}")
|
||
def get_preset(
|
||
preset_type: str,
|
||
_current_user: User = Depends(get_current_user),
|
||
):
|
||
"""获取单个行业预设包的详细信息(含全部角色配置)。"""
|
||
preset = get_company_preset(preset_type)
|
||
if not preset:
|
||
raise HTTPException(status_code=404, detail=f"预设包 '{preset_type}' 不存在")
|
||
return preset
|
||
|
||
|
||
@router.post("/{preset_type}", status_code=201)
|
||
def create_preset(
|
||
preset_type: str,
|
||
body: CreateCompanyPresetRequest = CreateCompanyPresetRequest(),
|
||
db: Session = Depends(get_db),
|
||
current_user: User = Depends(get_current_user),
|
||
):
|
||
"""一键创建全套公司 AI 数字员工。
|
||
|
||
支持通过 `selected_roles` 字段筛选要创建的角色,不传则创建预设包的全部角色。
|
||
"""
|
||
try:
|
||
result = create_company_preset(
|
||
db=db,
|
||
preset_type=preset_type,
|
||
user_id=current_user.id,
|
||
workspace_id=body.workspace_id,
|
||
selected_roles=body.selected_roles,
|
||
)
|
||
except ValueError as e:
|
||
raise HTTPException(status_code=400, detail=str(e))
|
||
|
||
logger.info(
|
||
"用户 %s 创建公司预设包 %s: 新建=%d 复用=%d",
|
||
current_user.id, preset_type, result["created"], result["reused"],
|
||
)
|
||
return result
|