feat: 审批流程模块 (T审批A审批)
- 新增 backend/app/api/approval.py 审批API - 前端H5支持发起审批、审批操作 - 添加审批卡片弹窗组件 - 路由注册审批模块
This commit is contained in:
@@ -0,0 +1,159 @@
|
||||
# =============================================================================
|
||||
# IT智能服务台 — 审批流程 API
|
||||
# =============================================================================
|
||||
# 说明:提供审批模板管理和跳转链接生成
|
||||
# - 模板124(资源申请):跳转审批
|
||||
# - 模板122(设备申请):API提交
|
||||
# =============================================================================
|
||||
|
||||
from typing import Optional
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from pydantic import BaseModel
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
# =============================================================================
|
||||
# 审批模板配置(可配置化,后续可存入数据库)
|
||||
# =============================================================================
|
||||
|
||||
# 企微审批模板配置
|
||||
APPROVAL_TEMPLATES = {
|
||||
# 模板124 - 资源申请(跳转审批)
|
||||
"Bs7ucTLPo42dtj8Y1LzBoujijsa6geRWaRxZJjk4X": {
|
||||
"id": "Bs7ucTLPo42dtj8Y1LzBoujijsa6geRWaRxZJjk4X",
|
||||
"name": "资源申请",
|
||||
"type": "jump", # 跳转审批
|
||||
"keywords": ["申请资源", "要资源", "申请"],
|
||||
},
|
||||
# 模板122 - 设备申请(API提交)
|
||||
"Bs7ucTGsPuFhxfk8pn8EydxrWxkVetB4JR8Pb6PHS": {
|
||||
"id": "Bs7ucTGsPuFhxfk8pn8EydxrWxkVetB4JR8Pb6PHS",
|
||||
"name": "设备申请",
|
||||
"type": "api", # API提交
|
||||
"keywords": ["申请设备", "要设备", "电脑", "笔记本"],
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# Schema 定义
|
||||
# =============================================================================
|
||||
|
||||
|
||||
class ApprovalTemplateResponse(BaseModel):
|
||||
"""审批模板响应"""
|
||||
id: str
|
||||
name: str
|
||||
type: str # "jump" 或 "api"
|
||||
keywords: list[str]
|
||||
|
||||
|
||||
class ApprovalJumpRequest(BaseModel):
|
||||
"""跳转审批请求"""
|
||||
template_id: str
|
||||
employee_id: Optional[str] = None
|
||||
|
||||
|
||||
class ApprovalJumpResponse(BaseModel):
|
||||
"""跳转审批响应"""
|
||||
url: str
|
||||
template_name: str
|
||||
|
||||
|
||||
class ApprovalSubmitRequest(BaseModel):
|
||||
"""API提交审批请求"""
|
||||
template_id: str
|
||||
employee_id: str
|
||||
content: dict # 审批内容
|
||||
|
||||
|
||||
class ApprovalSubmitResponse(BaseModel):
|
||||
"""API提交审批响应"""
|
||||
sp_no: str # 审批单号
|
||||
template_name: str
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# API 端点
|
||||
# =============================================================================
|
||||
|
||||
|
||||
@router.get("/approval/templates", response_model=list[ApprovalTemplateResponse])
|
||||
async def get_approval_templates():
|
||||
"""获取所有审批模板列表"""
|
||||
return list(APPROVAL_TEMPLATES.values())
|
||||
|
||||
|
||||
@router.get("/approval/templates/{template_id}", response_model=ApprovalTemplateResponse)
|
||||
async def get_approval_template(template_id: str):
|
||||
"""获取指定审批模板详情"""
|
||||
if template_id not in APPROVAL_TEMPLATES:
|
||||
from fastapi import HTTPException
|
||||
|
||||
raise HTTPException(status_code=404, detail="模板不存在")
|
||||
return APPROVAL_TEMPLATES[template_id]
|
||||
|
||||
|
||||
@router.post("/approval/jump", response_model=ApprovalJumpResponse)
|
||||
async def create_approval_jump(request: ApprovalJumpRequest):
|
||||
"""生成跳转审批链接(模板124跳转方式)"""
|
||||
template = APPROVAL_TEMPLATES.get(request.template_id)
|
||||
if not template:
|
||||
from fastapi import HTTPException
|
||||
|
||||
raise HTTPException(status_code=404, detail="模板不存在")
|
||||
|
||||
if template["type"] != "jump":
|
||||
from fastapi import HTTPException
|
||||
|
||||
raise HTTPException(status_code=400, detail="该模板不支持跳转方式")
|
||||
|
||||
# 生成跳转URL(企微审批链接格式)
|
||||
# 实际URL需要根据企微配置生成
|
||||
jump_url = f"https://qyapi.weixin.qq.com/cgi-bin/oa/applyevent?access_token=TOKEN&template_id={request.template_id}"
|
||||
|
||||
return ApprovalJumpResponse(
|
||||
url=jump_url,
|
||||
template_name=template["name"],
|
||||
)
|
||||
|
||||
|
||||
@router.post("/approval/submit", response_model=ApprovalSubmitResponse)
|
||||
async def submit_approval(request: ApprovalSubmitRequest):
|
||||
"""API提交审批(模板122 API方式)"""
|
||||
template = APPROVAL_TEMPLATES.get(request.template_id)
|
||||
if not template:
|
||||
from fastapi import HTTPException
|
||||
|
||||
raise HTTPException(status_code=404, detail="模板不存在")
|
||||
|
||||
if template["type"] != "api":
|
||||
from fastapi import HTTPException
|
||||
|
||||
raise HTTPException(status_code=400, detail="该模板不支持API提交")
|
||||
|
||||
# TODO: 调用企微API提交审批
|
||||
# 这里需要使用企微access_token调用审批API
|
||||
# 实际实现需要根据企微审批API文档
|
||||
|
||||
return ApprovalSubmitResponse(
|
||||
sp_no=f"SP{request.template_id[:8]}", # 模拟审批单号
|
||||
template_name=template["name"],
|
||||
)
|
||||
|
||||
|
||||
@router.get("/approval/keywords")
|
||||
async def get_approval_keywords():
|
||||
"""获取所有审批关键词(用于前端关键词检测)"""
|
||||
keywords = []
|
||||
for template in APPROVAL_TEMPLATES.values():
|
||||
for kw in template["keywords"]:
|
||||
keywords.append(
|
||||
{
|
||||
"keyword": kw,
|
||||
"template_id": template["id"],
|
||||
"template_name": template["name"],
|
||||
"type": template["type"],
|
||||
}
|
||||
)
|
||||
return keywords
|
||||
@@ -24,6 +24,7 @@ from app.api.upload import router as upload_router
|
||||
from app.api.admin import router as admin_router
|
||||
from app.api.portal import router as portal_router
|
||||
from app.api.admin_roles import router as admin_roles_router
|
||||
from app.api.approval import router as approval_router
|
||||
|
||||
# 创建 API 路由器
|
||||
# 所有子路由都会挂载到这个路由器上
|
||||
@@ -155,3 +156,11 @@ api_router.include_router(portal_router, tags=["统一入口"])
|
||||
# POST /api/admin/roles/mapping-rules — 创建映射规则
|
||||
# DELETE /api/admin/roles/mapping-rules/{id} — 删除映射规则
|
||||
api_router.include_router(admin_roles_router, tags=["角色管理"])
|
||||
|
||||
# 审批流程 API
|
||||
# GET /api/approval/templates — 获取审批模板列表
|
||||
# GET /api/approval/templates/{id} — 获取审批模板详情
|
||||
# POST /api/approval/jump — 生成跳转审批链接
|
||||
# POST /api/approval/submit — API提交审批
|
||||
# GET /api/approval/keywords — 获取审批关键词
|
||||
api_router.include_router(approval_router, tags=["审批流程"])
|
||||
|
||||
Reference in New Issue
Block a user