Files
zcglxt/app/api/v1/maintenance.py
Claude e71181f0a3 fix: 修复多个关键问题
- 修复前端路由守卫:未登录时不显示提示,直接跳转登录页
- 修复API拦截器:401错误不显示提示,直接跳转
- 增强验证码显示:图片尺寸从120x40增加到200x80
- 增大验证码字体:从28号增加到48号
- 优化验证码字符:排除易混淆的0和1
- 减少干扰线:从5条减少到3条,添加背景色优化
- 增强登录API日志:添加详细的调试日志
- 增强验证码生成和验证日志
- 优化异常处理和错误追踪

影响文件:
- src/router/index.ts
- src/api/request.ts
- app/services/auth_service.py
- app/api/v1/auth.py
- app/schemas/user.py

测试状态:
- 前端构建通过
- 后端语法检查通过
- 验证码显示效果优化完成

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 00:26:21 +08:00

258 lines
7.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
维修管理API路由
"""
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, status, Query
from sqlalchemy.orm import Session
from app.core.deps import get_db, get_current_user
from app.schemas.maintenance import (
MaintenanceRecordCreate,
MaintenanceRecordUpdate,
MaintenanceRecordStart,
MaintenanceRecordComplete,
MaintenanceRecordWithRelations,
MaintenanceRecordQueryParams,
MaintenanceStatistics
)
from app.services.maintenance_service import maintenance_service
router = APIRouter()
@router.get("/", response_model=list)
def get_maintenance_records(
skip: int = Query(0, ge=0, description="跳过条数"),
limit: int = Query(20, ge=1, le=100, description="返回条数"),
asset_id: Optional[int] = Query(None, description="资产ID"),
status: Optional[str] = Query(None, description="状态"),
fault_type: Optional[str] = Query(None, description="故障类型"),
priority: Optional[str] = Query(None, description="优先级"),
maintenance_type: Optional[str] = Query(None, description="维修类型"),
keyword: Optional[str] = Query(None, description="搜索关键词"),
db: Session = Depends(get_db),
current_user = Depends(get_current_user)
):
"""
获取维修记录列表
- **skip**: 跳过条数
- **limit**: 返回条数最大100
- **asset_id**: 资产ID筛选
- **status**: 状态筛选pending/in_progress/completed/cancelled
- **fault_type**: 故障类型筛选hardware/software/network/other
- **priority**: 优先级筛选low/normal/high/urgent
- **maintenance_type**: 维修类型筛选self_repair/vendor_repair/warranty
- **keyword**: 搜索关键词(单号/资产编码/故障描述)
"""
items, total = maintenance_service.get_records(
db=db,
skip=skip,
limit=limit,
asset_id=asset_id,
status=status,
fault_type=fault_type,
priority=priority,
maintenance_type=maintenance_type,
keyword=keyword
)
return items
@router.get("/statistics", response_model=MaintenanceStatistics)
def get_maintenance_statistics(
asset_id: Optional[int] = Query(None, description="资产ID"),
db: Session = Depends(get_db),
current_user = Depends(get_current_user)
):
"""
获取维修统计信息
- **asset_id**: 资产ID可选
返回维修记录总数、待处理数、维修中数、已完成数等统计信息
"""
return maintenance_service.get_statistics(db, asset_id)
@router.get("/{record_id}", response_model=dict)
def get_maintenance_record(
record_id: int,
db: Session = Depends(get_db),
current_user = Depends(get_current_user)
):
"""
获取维修记录详情
- **record_id**: 维修记录ID
返回维修记录详情及其关联信息
"""
return maintenance_service.get_record(db, record_id)
@router.post("/", response_model=dict, status_code=status.HTTP_201_CREATED)
def create_maintenance_record(
obj_in: MaintenanceRecordCreate,
db: Session = Depends(get_db),
current_user = Depends(get_current_user)
):
"""
创建维修记录
- **asset_id**: 资产ID
- **fault_description**: 故障描述
- **fault_type**: 故障类型hardware/software/network/other
- **priority**: 优先级low/normal/high/urgent
- **maintenance_type**: 维修类型self_repair/vendor_repair/warranty
- **vendor_id**: 维修供应商ID外部维修时必填
- **maintenance_cost**: 维修费用
- **maintenance_result**: 维修结果描述
- **replaced_parts**: 更换的配件
- **images**: 维修图片URL多个逗号分隔
- **remark**: 备注
"""
return maintenance_service.create_record(
db=db,
obj_in=obj_in,
report_user_id=current_user.id,
creator_id=current_user.id
)
@router.put("/{record_id}", response_model=dict)
def update_maintenance_record(
record_id: int,
obj_in: MaintenanceRecordUpdate,
db: Session = Depends(get_db),
current_user = Depends(get_current_user)
):
"""
更新维修记录
- **record_id**: 维修记录ID
- **fault_description**: 故障描述
- **fault_type**: 故障类型
- **priority**: 优先级
- **maintenance_type**: 维修类型
- **vendor_id**: 维修供应商ID
- **maintenance_cost**: 维修费用
- **maintenance_result**: 维修结果描述
- **replaced_parts**: 更换的配件
- **images**: 维修图片URL
- **remark**: 备注
已完成的维修记录不能更新
"""
return maintenance_service.update_record(
db=db,
record_id=record_id,
obj_in=obj_in,
updater_id=current_user.id
)
@router.post("/{record_id}/start", response_model=dict)
def start_maintenance(
record_id: int,
start_in: MaintenanceRecordStart,
db: Session = Depends(get_db),
current_user = Depends(get_current_user)
):
"""
开始维修
- **record_id**: 维修记录ID
- **maintenance_type**: 维修类型
- self_repair: 自行维修
- vendor_repair: 外部维修需指定vendor_id
- warranty: 保修维修
- **vendor_id**: 维修供应商ID外部维修时必填
- **remark**: 备注
只有待处理状态的维修记录可以开始维修
"""
return maintenance_service.start_maintenance(
db=db,
record_id=record_id,
start_in=start_in,
maintenance_user_id=current_user.id
)
@router.post("/{record_id}/complete", response_model=dict)
def complete_maintenance(
record_id: int,
complete_in: MaintenanceRecordComplete,
db: Session = Depends(get_db),
current_user = Depends(get_current_user)
):
"""
完成维修
- **record_id**: 维修记录ID
- **maintenance_result**: 维修结果描述
- **maintenance_cost**: 维修费用
- **replaced_parts**: 更换的配件
- **images**: 维修图片URL
- **asset_status**: 资产维修后状态in_stock/in_use
只有维修中的记录可以完成
"""
return maintenance_service.complete_maintenance(
db=db,
record_id=record_id,
complete_in=complete_in,
maintenance_user_id=current_user.id
)
@router.post("/{record_id}/cancel", response_model=dict)
def cancel_maintenance(
record_id: int,
db: Session = Depends(get_db),
current_user = Depends(get_current_user)
):
"""
取消维修
- **record_id**: 维修记录ID
已完成的维修记录不能取消
"""
return maintenance_service.cancel_maintenance(db, record_id)
@router.delete("/{record_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_maintenance_record(
record_id: int,
db: Session = Depends(get_db),
current_user = Depends(get_current_user)
):
"""
删除维修记录
- **record_id**: 维修记录ID
只能删除待处理或已取消的维修记录
"""
maintenance_service.delete_record(db, record_id)
return None
@router.get("/asset/{asset_id}", response_model=list)
def get_asset_maintenance_records(
asset_id: int,
skip: int = Query(0, ge=0, description="跳过条数"),
limit: int = Query(50, ge=1, le=100, description="返回条数"),
db: Session = Depends(get_db),
current_user = Depends(get_current_user)
):
"""
获取资产的维修记录
- **asset_id**: 资产ID
- **skip**: 跳过条数
- **limit**: 返回条数
"""
return maintenance_service.get_asset_records(db, asset_id, skip, limit)