work_order_service.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from __future__ import annotations
  2. from datetime import datetime, timezone
  3. from sqlalchemy.orm import Session
  4. from app.core.errors import APIError
  5. from app.db.base import new_id
  6. from app.db.models.work_order import WorkOrder
  7. from app.db.repositories import work_order as work_order_repo
  8. from app.schemas.work_order import WorkOrderCreate, WorkOrderEventCreate, WorkOrderUpdate
  9. def _order_no() -> str:
  10. stamp = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%S")
  11. return f"WO-{stamp}-{new_id()[:6].upper()}"
  12. def create_work_order(db: Session, payload: WorkOrderCreate) -> WorkOrder:
  13. data = payload.model_dump(exclude={"metadata"})
  14. data["order_no"] = _order_no()
  15. data["metadata_json"] = payload.metadata
  16. work_order = work_order_repo.create_work_order(db, data)
  17. work_order_repo.create_event(
  18. db,
  19. {
  20. "work_order_id": work_order.id,
  21. "event_type": "created",
  22. "to_status": work_order.status,
  23. "operator_id": "",
  24. "operator_name": "",
  25. "comment": "创建整改任务",
  26. "attachments": [],
  27. "created_at": datetime.now(timezone.utc),
  28. },
  29. )
  30. return work_order
  31. def update_work_order(
  32. db: Session,
  33. work_order_id: str,
  34. payload: WorkOrderUpdate,
  35. *,
  36. operator_name: str = "",
  37. ) -> WorkOrder:
  38. work_order = work_order_repo.get_work_order(db, work_order_id)
  39. if work_order is None:
  40. raise APIError(404, "work_order_not_found", "整改任务不存在")
  41. old_status = work_order.status
  42. updates = payload.model_dump(exclude_unset=True)
  43. if "metadata" in updates:
  44. updates["metadata_json"] = updates.pop("metadata")
  45. work_order = work_order_repo.update_work_order(db, work_order, updates)
  46. if payload.status and payload.status != old_status:
  47. work_order_repo.create_event(
  48. db,
  49. {
  50. "work_order_id": work_order.id,
  51. "event_type": "status_changed",
  52. "from_status": old_status,
  53. "to_status": payload.status,
  54. "operator_id": "",
  55. "operator_name": operator_name,
  56. "comment": "",
  57. "attachments": [],
  58. "created_at": datetime.now(timezone.utc),
  59. },
  60. )
  61. return work_order
  62. def add_event(
  63. db: Session,
  64. work_order_id: str,
  65. payload: WorkOrderEventCreate,
  66. ):
  67. if work_order_repo.get_work_order(db, work_order_id) is None:
  68. raise APIError(404, "work_order_not_found", "整改任务不存在")
  69. data = payload.model_dump()
  70. data["work_order_id"] = work_order_id
  71. data["created_at"] = datetime.now(timezone.utc)
  72. return work_order_repo.create_event(db, data)