mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-09-23 13:13:09 +00:00
refactor(工单/版本模块): 重构工单和版本模块代码结构
重构工单和版本模块的模型、服务层、控制器及CRUD操作 移除冗余代码,统一使用基础CRUD类实现 添加查询参数类用于工单和版本管理 优化模型字段定义和关系映射
This commit is contained in:
@@ -1,58 +1,4 @@
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from sqlalchemy.orm import Session
|
||||
from app.api.v1.module_system.ticket.schema import TicketCreate, TicketUpdate, TicketOut
|
||||
from app.api.v1.module_system.ticket.service import ticket_service
|
||||
from app.core.database import get_db
|
||||
from fastapi import APIRouter
|
||||
|
||||
router = APIRouter(prefix="/tickets", tags=["工单管理"])
|
||||
|
||||
|
||||
@router.post("/", response_model=TicketOut)
|
||||
def create_ticket(ticket: TicketCreate, db: Session = Depends(get_db)):
|
||||
"""创建工单"""
|
||||
return ticket_service.create_ticket(db, ticket)
|
||||
|
||||
|
||||
@router.get("/{ticket_id}", response_model=TicketOut)
|
||||
def get_ticket(ticket_id: int, db: Session = Depends(get_db)):
|
||||
"""获取工单详情"""
|
||||
db_ticket = ticket_service.get_ticket(db, ticket_id)
|
||||
if db_ticket is None:
|
||||
raise HTTPException(status_code=404, detail="工单不存在")
|
||||
return db_ticket
|
||||
|
||||
|
||||
@router.get("/", response_model=list[TicketOut])
|
||||
def get_tickets(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
|
||||
"""获取工单列表"""
|
||||
return ticket_service.get_tickets(db, skip=skip, limit=limit)
|
||||
|
||||
|
||||
@router.put("/{ticket_id}", response_model=TicketOut)
|
||||
def update_ticket(ticket_id: int, ticket: TicketUpdate, db: Session = Depends(get_db)):
|
||||
"""更新工单"""
|
||||
db_ticket = ticket_service.update_ticket(db, ticket_id, ticket)
|
||||
if db_ticket is None:
|
||||
raise HTTPException(status_code=404, detail="工单不存在")
|
||||
return db_ticket
|
||||
|
||||
|
||||
@router.delete("/{ticket_id}", response_model=TicketOut)
|
||||
def delete_ticket(ticket_id: int, db: Session = Depends(get_db)):
|
||||
"""删除工单"""
|
||||
db_ticket = ticket_service.get_ticket(db, ticket_id)
|
||||
if db_ticket is None:
|
||||
raise HTTPException(status_code=404, detail="工单不存在")
|
||||
return ticket_service.delete_ticket(db, ticket_id)
|
||||
|
||||
|
||||
@router.get("/status/{status}", response_model=list[TicketOut])
|
||||
def get_tickets_by_status(status: str, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
|
||||
"""根据状态获取工单列表"""
|
||||
return ticket_service.get_tickets_by_status(db, status=status, skip=skip, limit=limit)
|
||||
|
||||
|
||||
@router.get("/assignee/{assignee_id}", response_model=list[TicketOut])
|
||||
def get_tickets_by_assignee(assignee_id: int, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
|
||||
"""根据指派用户获取工单列表"""
|
||||
return ticket_service.get_tickets_by_assignee(db, assignee_id=assignee_id, skip=skip, limit=limit)
|
||||
@@ -3,26 +3,14 @@ from typing import List
|
||||
from app.api.v1.module_system.ticket.model import Ticket
|
||||
from app.api.v1.module_system.ticket.schema import TicketCreate, TicketUpdate
|
||||
from app.core.base_crud import CRUDBase
|
||||
|
||||
from ..auth.schema import AuthSchema
|
||||
|
||||
class CRUDTicket(CRUDBase[Ticket, TicketCreate, TicketUpdate]):
|
||||
"""工单 CRUD 操作"""
|
||||
|
||||
def get_ticket_by_id(self, db: Session, ticket_id: int) -> Ticket:
|
||||
"""根据ID获取工单"""
|
||||
return db.query(self.model).filter(self.model.id == ticket_id).first()
|
||||
|
||||
def get_tickets(self, db: Session, skip: int = 0, limit: int = 100) -> List[Ticket]:
|
||||
"""获取工单列表"""
|
||||
return db.query(self.model).offset(skip).limit(limit).all()
|
||||
|
||||
def get_tickets_by_status(self, db: Session, status: str, skip: int = 0, limit: int = 100) -> List[Ticket]:
|
||||
"""根据状态获取工单列表"""
|
||||
return db.query(self.model).filter(self.model.status == status).offset(skip).limit(limit).all()
|
||||
|
||||
def get_tickets_by_assignee(self, db: Session, assignee_id: int, skip: int = 0, limit: int = 100) -> List[Ticket]:
|
||||
"""根据指派用户获取工单列表"""
|
||||
return db.query(self.model).filter(self.model.assignee_id == assignee_id).offset(skip).limit(limit).all()
|
||||
|
||||
|
||||
ticket_crud = CRUDTicket(Ticket)
|
||||
def __init__(self, auth: AuthSchema) -> None:
|
||||
"""初始化工单CRUD"""
|
||||
self.auth = auth
|
||||
super().__init__(model=Ticket, auth=auth)
|
||||
|
||||
pass
|
||||
|
||||
@@ -1,19 +1,16 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey
|
||||
from sqlalchemy.orm import relationship
|
||||
from app.core.base_model import BaseModel
|
||||
from app.api.v1.module_system.user.model import User
|
||||
from datetime import datetime
|
||||
from app.core.base_model import MappedBase, CreatorMixin
|
||||
|
||||
|
||||
class Ticket(BaseModel):
|
||||
class Ticket(CreatorMixin):
|
||||
"""工单模型"""
|
||||
__tablename__ = "ticket"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True, comment="工单ID")
|
||||
|
||||
|
||||
title = Column(String(255), nullable=False, comment="工单标题")
|
||||
|
||||
status = Column(String(50), default="open", comment="工单状态(open, in_progress, resolved, closed)")
|
||||
status = Column(String(50), default="1", comment="工单状态(1:待处理 2:处理中 3:已解决 4:已关闭)")
|
||||
priority = Column(String(50), default="medium", comment="优先级(low, medium, high, urgent)")
|
||||
type = Column(String(50), comment="工单类型(bug, feature, task)")
|
||||
assignee_id = Column(Integer, ForeignKey("system_user.id"), comment="指派给用户ID")
|
||||
@@ -21,10 +18,6 @@ class Ticket(BaseModel):
|
||||
project = Column(String(100), comment="所属项目")
|
||||
version = Column(String(50), comment="版本号")
|
||||
|
||||
description = Column(Text, comment="工单描述")
|
||||
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
|
||||
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
|
||||
|
||||
# 关系
|
||||
assignee = relationship("User", foreign_keys=[assignee_id])
|
||||
reporter = relationship("User", foreign_keys=[reporter_id])
|
||||
assignee = relationship("UserModel", foreign_keys=[assignee_id])
|
||||
reporter = relationship("UserModel", foreign_keys=[reporter_id])
|
||||
@@ -0,0 +1,32 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from fastapi import Query
|
||||
|
||||
from app.core.validator import DateTimeStr
|
||||
class TicketQueryParams:
|
||||
"""工单管理查询参数"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
title: Optional[str] = Query(None, description="工单标题"),
|
||||
status: Optional[bool] = Query(None, description="是否可用"),
|
||||
creator: Optional[int] = Query(None, description="创建人"),
|
||||
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2023-01-01 00:00:00"),
|
||||
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2023-12-31 23:59:59"),
|
||||
) -> None:
|
||||
super().__init__()
|
||||
|
||||
# 模糊查询字段
|
||||
self.title = ("like", title)
|
||||
|
||||
# 精确查询字段
|
||||
self.creator_id = creator
|
||||
self.status = status
|
||||
|
||||
# 时间范围查询
|
||||
if start_time and end_time:
|
||||
start_datetime = datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S')
|
||||
end_datetime = datetime.strptime(end_time, '%Y-%m-%d %H:%M:%S')
|
||||
self.created_at = ("between", (start_datetime, end_datetime))
|
||||
@@ -1,3 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from pydantic import BaseModel
|
||||
from typing import Optional, List
|
||||
from datetime import datetime
|
||||
|
||||
@@ -1,48 +1,12 @@
|
||||
from sqlalchemy.orm import Session
|
||||
from app.api.v1.module_system.ticket.crud import ticket_crud
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from typing import Dict, List, Optional, Sequence
|
||||
from app.api.v1.module_system.auth.schema import AuthSchema
|
||||
from app.api.v1.module_system.ticket.crud import TicketCRUD
|
||||
from app.api.v1.module_system.ticket.schema import TicketCreate, TicketUpdate
|
||||
|
||||
|
||||
class TicketService:
|
||||
"""工单服务类"""
|
||||
|
||||
@staticmethod
|
||||
def create_ticket(db: Session, ticket_create: TicketCreate):
|
||||
"""创建工单"""
|
||||
return ticket_crud.create(db, obj_in=ticket_create)
|
||||
|
||||
@staticmethod
|
||||
def get_ticket(db: Session, ticket_id: int):
|
||||
"""获取工单"""
|
||||
return ticket_crud.get(db, id=ticket_id)
|
||||
|
||||
@staticmethod
|
||||
def get_tickets(db: Session, skip: int = 0, limit: int = 100):
|
||||
"""获取工单列表"""
|
||||
return ticket_crud.get_multi(db, skip=skip, limit=limit)
|
||||
|
||||
@staticmethod
|
||||
def update_ticket(db: Session, ticket_id: int, ticket_update: TicketUpdate):
|
||||
"""更新工单"""
|
||||
db_ticket = ticket_crud.get(db, id=ticket_id)
|
||||
if db_ticket:
|
||||
return ticket_crud.update(db, db_obj=db_ticket, obj_in=ticket_update)
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def delete_ticket(db: Session, ticket_id: int):
|
||||
"""删除工单"""
|
||||
return ticket_crud.remove(db, id=ticket_id)
|
||||
|
||||
@staticmethod
|
||||
def get_tickets_by_status(db: Session, status: str, skip: int = 0, limit: int = 100):
|
||||
"""根据状态获取工单列表"""
|
||||
return ticket_crud.get_tickets_by_status(db, status=status, skip=skip, limit=limit)
|
||||
|
||||
@staticmethod
|
||||
def get_tickets_by_assignee(db: Session, assignee_id: int, skip: int = 0, limit: int = 100):
|
||||
"""根据指派用户获取工单列表"""
|
||||
return ticket_crud.get_tickets_by_assignee(db, assignee_id=assignee_id, skip=skip, limit=limit)
|
||||
"""工单模块服务层"""
|
||||
|
||||
|
||||
ticket_service = TicketService()
|
||||
pass
|
||||
Reference in New Issue
Block a user