Fix API compatibility and add user/role/permission and asset import/export
This commit is contained in:
247
backend_new/app/crud/maintenance.py
Normal file
247
backend_new/app/crud/maintenance.py
Normal file
@@ -0,0 +1,247 @@
|
||||
"""
|
||||
维修管理相关CRUD操作
|
||||
"""
|
||||
from typing import List, Optional, Tuple
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import and_, or_, func
|
||||
from app.models.maintenance import MaintenanceRecord
|
||||
from app.schemas.maintenance import MaintenanceRecordCreate, MaintenanceRecordUpdate
|
||||
|
||||
|
||||
class MaintenanceRecordCRUD:
|
||||
"""维修记录CRUD操作"""
|
||||
|
||||
def get(self, db: Session, id: int) -> Optional[MaintenanceRecord]:
|
||||
"""根据ID获取维修记录"""
|
||||
return db.query(MaintenanceRecord).filter(
|
||||
MaintenanceRecord.id == id
|
||||
).first()
|
||||
|
||||
def get_by_code(self, db: Session, record_code: str) -> Optional[MaintenanceRecord]:
|
||||
"""根据单号获取维修记录"""
|
||||
return db.query(MaintenanceRecord).filter(
|
||||
MaintenanceRecord.record_code == record_code
|
||||
).first()
|
||||
|
||||
def get_multi(
|
||||
self,
|
||||
db: Session,
|
||||
skip: int = 0,
|
||||
limit: int = 20,
|
||||
asset_id: Optional[int] = None,
|
||||
status: Optional[str] = None,
|
||||
fault_type: Optional[str] = None,
|
||||
priority: Optional[str] = None,
|
||||
maintenance_type: Optional[str] = None,
|
||||
keyword: Optional[str] = None
|
||||
) -> Tuple[List[MaintenanceRecord], int]:
|
||||
"""获取维修记录列表"""
|
||||
query = db.query(MaintenanceRecord)
|
||||
|
||||
# 筛选条件
|
||||
if asset_id:
|
||||
query = query.filter(MaintenanceRecord.asset_id == asset_id)
|
||||
if status:
|
||||
query = query.filter(MaintenanceRecord.status == status)
|
||||
if fault_type:
|
||||
query = query.filter(MaintenanceRecord.fault_type == fault_type)
|
||||
if priority:
|
||||
query = query.filter(MaintenanceRecord.priority == priority)
|
||||
if maintenance_type:
|
||||
query = query.filter(MaintenanceRecord.maintenance_type == maintenance_type)
|
||||
if keyword:
|
||||
query = query.filter(
|
||||
or_(
|
||||
MaintenanceRecord.record_code.like(f"%{keyword}%"),
|
||||
MaintenanceRecord.asset_code.like(f"%{keyword}%"),
|
||||
MaintenanceRecord.fault_description.like(f"%{keyword}%")
|
||||
)
|
||||
)
|
||||
|
||||
# 排序
|
||||
query = query.order_by(MaintenanceRecord.report_time.desc())
|
||||
|
||||
# 总数
|
||||
total = query.count()
|
||||
|
||||
# 分页
|
||||
items = query.offset(skip).limit(limit).all()
|
||||
|
||||
return items, total
|
||||
|
||||
def create(
|
||||
self,
|
||||
db: Session,
|
||||
obj_in: MaintenanceRecordCreate,
|
||||
record_code: str,
|
||||
asset_code: str,
|
||||
report_user_id: int,
|
||||
creator_id: int
|
||||
) -> MaintenanceRecord:
|
||||
"""创建维修记录"""
|
||||
db_obj = MaintenanceRecord(
|
||||
record_code=record_code,
|
||||
asset_id=obj_in.asset_id,
|
||||
asset_code=asset_code,
|
||||
fault_description=obj_in.fault_description,
|
||||
fault_type=obj_in.fault_type,
|
||||
report_user_id=report_user_id,
|
||||
priority=obj_in.priority,
|
||||
maintenance_type=obj_in.maintenance_type,
|
||||
vendor_id=obj_in.vendor_id,
|
||||
maintenance_cost=obj_in.maintenance_cost,
|
||||
maintenance_result=obj_in.maintenance_result,
|
||||
replaced_parts=obj_in.replaced_parts,
|
||||
images=obj_in.images,
|
||||
remark=obj_in.remark,
|
||||
status="pending",
|
||||
created_by=creator_id
|
||||
)
|
||||
db.add(db_obj)
|
||||
db.commit()
|
||||
db.refresh(db_obj)
|
||||
return db_obj
|
||||
|
||||
def update(
|
||||
self,
|
||||
db: Session,
|
||||
db_obj: MaintenanceRecord,
|
||||
obj_in: MaintenanceRecordUpdate,
|
||||
updater_id: int
|
||||
) -> MaintenanceRecord:
|
||||
"""更新维修记录"""
|
||||
update_data = obj_in.model_dump(exclude_unset=True)
|
||||
for field, value in update_data.items():
|
||||
setattr(db_obj, field, value)
|
||||
db_obj.updated_by = updater_id
|
||||
db.add(db_obj)
|
||||
db.commit()
|
||||
db.refresh(db_obj)
|
||||
return db_obj
|
||||
|
||||
def start_maintenance(
|
||||
self,
|
||||
db: Session,
|
||||
db_obj: MaintenanceRecord,
|
||||
maintenance_type: str,
|
||||
maintenance_user_id: int,
|
||||
vendor_id: Optional[int] = None
|
||||
) -> MaintenanceRecord:
|
||||
"""开始维修"""
|
||||
from datetime import datetime
|
||||
|
||||
db_obj.status = "in_progress"
|
||||
db_obj.start_time = datetime.utcnow()
|
||||
db_obj.maintenance_type = maintenance_type
|
||||
db_obj.maintenance_user_id = maintenance_user_id
|
||||
if vendor_id:
|
||||
db_obj.vendor_id = vendor_id
|
||||
|
||||
db.add(db_obj)
|
||||
db.commit()
|
||||
db.refresh(db_obj)
|
||||
return db_obj
|
||||
|
||||
def complete_maintenance(
|
||||
self,
|
||||
db: Session,
|
||||
db_obj: MaintenanceRecord,
|
||||
maintenance_result: str,
|
||||
maintenance_cost: Optional[float] = None,
|
||||
replaced_parts: Optional[str] = None,
|
||||
images: Optional[str] = None
|
||||
) -> MaintenanceRecord:
|
||||
"""完成维修"""
|
||||
from datetime import datetime
|
||||
|
||||
db_obj.status = "completed"
|
||||
db_obj.complete_time = datetime.utcnow()
|
||||
db_obj.maintenance_result = maintenance_result
|
||||
if maintenance_cost is not None:
|
||||
db_obj.maintenance_cost = maintenance_cost
|
||||
if replaced_parts:
|
||||
db_obj.replaced_parts = replaced_parts
|
||||
if images:
|
||||
db_obj.images = images
|
||||
|
||||
db.add(db_obj)
|
||||
db.commit()
|
||||
db.refresh(db_obj)
|
||||
return db_obj
|
||||
|
||||
def cancel_maintenance(
|
||||
self,
|
||||
db: Session,
|
||||
db_obj: MaintenanceRecord
|
||||
) -> MaintenanceRecord:
|
||||
"""取消维修"""
|
||||
db_obj.status = "cancelled"
|
||||
db.add(db_obj)
|
||||
db.commit()
|
||||
db.refresh(db_obj)
|
||||
return db_obj
|
||||
|
||||
def delete(self, db: Session, id: int) -> bool:
|
||||
"""删除维修记录"""
|
||||
obj = self.get(db, id)
|
||||
if obj:
|
||||
db.delete(obj)
|
||||
db.commit()
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_statistics(
|
||||
self,
|
||||
db: Session,
|
||||
asset_id: Optional[int] = None
|
||||
) -> dict:
|
||||
"""获取维修统计信息"""
|
||||
from decimal import Decimal
|
||||
|
||||
query = db.query(MaintenanceRecord)
|
||||
|
||||
if asset_id:
|
||||
query = query.filter(MaintenanceRecord.asset_id == asset_id)
|
||||
|
||||
total = query.count()
|
||||
pending = query.filter(MaintenanceRecord.status == "pending").count()
|
||||
in_progress = query.filter(MaintenanceRecord.status == "in_progress").count()
|
||||
completed = query.filter(MaintenanceRecord.status == "completed").count()
|
||||
cancelled = query.filter(MaintenanceRecord.status == "cancelled").count()
|
||||
|
||||
# 总维修费用
|
||||
total_cost_result = query.filter(
|
||||
MaintenanceRecord.status == "completed",
|
||||
MaintenanceRecord.maintenance_cost.isnot(None)
|
||||
).with_entities(
|
||||
func.sum(MaintenanceRecord.maintenance_cost)
|
||||
).first()
|
||||
|
||||
total_cost = total_cost_result[0] if total_cost_result and total_cost_result[0] else Decimal("0.00")
|
||||
|
||||
return {
|
||||
"total": total,
|
||||
"pending": pending,
|
||||
"in_progress": in_progress,
|
||||
"completed": completed,
|
||||
"cancelled": cancelled,
|
||||
"total_cost": total_cost
|
||||
}
|
||||
|
||||
def get_by_asset(
|
||||
self,
|
||||
db: Session,
|
||||
asset_id: int,
|
||||
skip: int = 0,
|
||||
limit: int = 50
|
||||
) -> List[MaintenanceRecord]:
|
||||
"""根据资产ID获取维修记录"""
|
||||
return db.query(MaintenanceRecord).filter(
|
||||
MaintenanceRecord.asset_id == asset_id
|
||||
).order_by(
|
||||
MaintenanceRecord.report_time.desc()
|
||||
).offset(skip).limit(limit).all()
|
||||
|
||||
|
||||
# 创建全局实例
|
||||
maintenance_record = MaintenanceRecordCRUD()
|
||||
Reference in New Issue
Block a user