163 lines
5.2 KiB
Python
163 lines
5.2 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
电子签章API接口
|
|
"""
|
|
from typing import Optional, List
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query, Request
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.database import get_db
|
|
from app.config import settings
|
|
from app.base_schema import PaginatedResponse, ResponseModel
|
|
|
|
from online_dev.electronic_seal.schema import (
|
|
ElectronicSealCreate, ElectronicSealUpdate, ElectronicSealOut, SealUsageLogOut
|
|
)
|
|
from online_dev.electronic_seal.service import ElectronicSealService, SealUsageLogService
|
|
|
|
router = APIRouter(prefix="/electronic-seal", tags=["电子签章"])
|
|
|
|
|
|
@router.get("", response_model=PaginatedResponse[ElectronicSealOut], summary="获取签章列表")
|
|
async def get_seal_list(
|
|
page: int = Query(default=1, ge=1),
|
|
page_size: int = Query(default=settings.PAGE_SIZE, ge=1, le=settings.PAGE_MAX_SIZE, alias="pageSize"),
|
|
seal_type: Optional[str] = Query(default=None, alias="sealType"),
|
|
status: Optional[str] = Query(default=None),
|
|
keyword: Optional[str] = Query(default=None),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""获取签章列表"""
|
|
items, total = await ElectronicSealService.get_list(
|
|
db,
|
|
page=page,
|
|
page_size=page_size,
|
|
seal_type=seal_type,
|
|
status=status,
|
|
keyword=keyword,
|
|
)
|
|
return PaginatedResponse(items=items, total=total)
|
|
|
|
|
|
@router.get("/available", response_model=List[ElectronicSealOut], summary="获取可用签章")
|
|
async def get_available_seals(
|
|
template_id: Optional[str] = Query(default=None, alias="templateId"),
|
|
db: AsyncSession = Depends(get_db),
|
|
request: Request = None,
|
|
):
|
|
"""获取当前用户可用的签章"""
|
|
# 从请求中获取用户信息
|
|
user_id = getattr(request.state, "user_id", "") if request else ""
|
|
dept_id = getattr(request.state, "dept_id", None) if request else None
|
|
role_ids = getattr(request.state, "role_ids", None) if request else None
|
|
|
|
seals = await ElectronicSealService.get_available_seals(
|
|
db,
|
|
user_id=user_id,
|
|
dept_id=dept_id,
|
|
role_ids=role_ids,
|
|
template_id=template_id,
|
|
)
|
|
return seals
|
|
|
|
|
|
@router.post("", response_model=ElectronicSealOut, summary="创建签章")
|
|
async def create_seal(
|
|
data: ElectronicSealCreate,
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""创建电子签章"""
|
|
seal = await ElectronicSealService.create(db, data)
|
|
return seal
|
|
|
|
|
|
@router.get("/{seal_id}", response_model=ElectronicSealOut, summary="获取签章详情")
|
|
async def get_seal(
|
|
seal_id: str,
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""获取签章详情"""
|
|
seal = await ElectronicSealService.get_by_id(db, seal_id)
|
|
if not seal:
|
|
raise HTTPException(status_code=404, detail="签章不存在")
|
|
return seal
|
|
|
|
|
|
@router.put("/{seal_id}", response_model=ElectronicSealOut, summary="更新签章")
|
|
async def update_seal(
|
|
seal_id: str,
|
|
data: ElectronicSealUpdate,
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""更新签章"""
|
|
seal = await ElectronicSealService.update(db, seal_id, data)
|
|
if not seal:
|
|
raise HTTPException(status_code=404, detail="签章不存在")
|
|
return seal
|
|
|
|
|
|
@router.delete("/{seal_id}", response_model=ResponseModel, summary="删除签章")
|
|
async def delete_seal(
|
|
seal_id: str,
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""删除签章"""
|
|
seal = await ElectronicSealService.get_by_id(db, seal_id)
|
|
if not seal:
|
|
raise HTTPException(status_code=404, detail="签章不存在")
|
|
|
|
await ElectronicSealService.delete(db, seal_id)
|
|
return ResponseModel(message="删除成功")
|
|
|
|
|
|
@router.post("/{seal_id}/enable", response_model=ElectronicSealOut, summary="启用签章")
|
|
async def enable_seal(
|
|
seal_id: str,
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""启用签章"""
|
|
seal = await ElectronicSealService.get_by_id(db, seal_id)
|
|
if not seal:
|
|
raise HTTPException(status_code=404, detail="签章不存在")
|
|
|
|
seal = await ElectronicSealService.update(
|
|
db, seal_id, ElectronicSealUpdate(status="active")
|
|
)
|
|
return seal
|
|
|
|
|
|
@router.post("/{seal_id}/disable", response_model=ElectronicSealOut, summary="禁用签章")
|
|
async def disable_seal(
|
|
seal_id: str,
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""禁用签章"""
|
|
seal = await ElectronicSealService.get_by_id(db, seal_id)
|
|
if not seal:
|
|
raise HTTPException(status_code=404, detail="签章不存在")
|
|
|
|
seal = await ElectronicSealService.update(
|
|
db, seal_id, ElectronicSealUpdate(status="disabled")
|
|
)
|
|
return seal
|
|
|
|
|
|
@router.get("/{seal_id}/logs", response_model=PaginatedResponse[SealUsageLogOut], summary="获取签章使用记录")
|
|
async def get_seal_usage_logs(
|
|
seal_id: str,
|
|
page: int = Query(default=1, ge=1),
|
|
page_size: int = Query(default=settings.PAGE_SIZE, ge=1, le=settings.PAGE_MAX_SIZE, alias="pageSize"),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""获取签章的使用记录"""
|
|
seal = await ElectronicSealService.get_by_id(db, seal_id)
|
|
if not seal:
|
|
raise HTTPException(status_code=404, detail="签章不存在")
|
|
|
|
items, total = await SealUsageLogService.get_logs_by_seal(
|
|
db, seal_id, page=page, page_size=page_size
|
|
)
|
|
return PaginatedResponse(items=items, total=total)
|