| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- from __future__ import annotations
- from datetime import datetime, timezone
- from sqlalchemy.orm import Session
- from app.core.errors import APIError
- from app.db.base import new_id
- from app.db.models.work_order import WorkOrder
- from app.db.repositories import work_order as work_order_repo
- from app.schemas.work_order import WorkOrderCreate, WorkOrderEventCreate, WorkOrderUpdate
- def _order_no() -> str:
- stamp = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%S")
- return f"WO-{stamp}-{new_id()[:6].upper()}"
- def create_work_order(db: Session, payload: WorkOrderCreate) -> WorkOrder:
- data = payload.model_dump(exclude={"metadata"})
- data["order_no"] = _order_no()
- data["metadata_json"] = payload.metadata
- work_order = work_order_repo.create_work_order(db, data)
- work_order_repo.create_event(
- db,
- {
- "work_order_id": work_order.id,
- "event_type": "created",
- "to_status": work_order.status,
- "operator_id": "",
- "operator_name": "",
- "comment": "创建整改任务",
- "attachments": [],
- "created_at": datetime.now(timezone.utc),
- },
- )
- return work_order
- def update_work_order(
- db: Session,
- work_order_id: str,
- payload: WorkOrderUpdate,
- *,
- operator_name: str = "",
- ) -> WorkOrder:
- work_order = work_order_repo.get_work_order(db, work_order_id)
- if work_order is None:
- raise APIError(404, "work_order_not_found", "整改任务不存在")
- old_status = work_order.status
- updates = payload.model_dump(exclude_unset=True)
- if "metadata" in updates:
- updates["metadata_json"] = updates.pop("metadata")
- work_order = work_order_repo.update_work_order(db, work_order, updates)
- if payload.status and payload.status != old_status:
- work_order_repo.create_event(
- db,
- {
- "work_order_id": work_order.id,
- "event_type": "status_changed",
- "from_status": old_status,
- "to_status": payload.status,
- "operator_id": "",
- "operator_name": operator_name,
- "comment": "",
- "attachments": [],
- "created_at": datetime.now(timezone.utc),
- },
- )
- return work_order
- def add_event(
- db: Session,
- work_order_id: str,
- payload: WorkOrderEventCreate,
- ):
- if work_order_repo.get_work_order(db, work_order_id) is None:
- raise APIError(404, "work_order_not_found", "整改任务不存在")
- data = payload.model_dump()
- data["work_order_id"] = work_order_id
- data["created_at"] = datetime.now(timezone.utc)
- return work_order_repo.create_event(db, data)
|