sample_storage_cert_qc.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. """样本储存证质检信息 API"""
  2. from typing import Any, Dict, Optional
  3. from fastapi import APIRouter, Depends
  4. from pydantic import BaseModel, ConfigDict, Field
  5. from sqlalchemy.orm import Session
  6. from app.core.database import get_db
  7. from app.core.menu_guard import require_any_menu_code, require_strict_any_menu_code
  8. from app.core.response import error_response, success_response
  9. from app.crud import sample_storage_cert_qc as svc
  10. from app.models.models import SysUser
  11. router = APIRouter(prefix="/web/admin", tags=["储存证质检信息"])
  12. READ_MENUS = (
  13. "biz:qcWorkOrder:list",
  14. "biz:myQcTask:list",
  15. "cell-storage:sample-info:list",
  16. )
  17. WRITE_MENUS = (
  18. "biz:qcWorkOrder:list",
  19. "biz:myQcTask:list",
  20. )
  21. def _get_tenant_no(db: Session, user: dict) -> str:
  22. user_id = user.get("user_id")
  23. if not user_id:
  24. raise PermissionError("用户身份信息缺失,无法确定租户")
  25. sys_user = db.query(SysUser).filter(SysUser.id == user_id).first()
  26. if not sys_user or not sys_user.tenant_no:
  27. raise PermissionError("用户租户信息缺失")
  28. return sys_user.tenant_no
  29. def _get_current_user_id(user: dict) -> str:
  30. user_id = user.get("user_id")
  31. if not user_id:
  32. raise PermissionError("用户身份信息缺失")
  33. return str(user_id)
  34. class UpsertBody(BaseModel):
  35. model_config = ConfigDict(populate_by_name=True)
  36. payload: Dict[str, Any] = Field(default_factory=dict)
  37. qc_work_order_id: Optional[str] = Field(None, alias="qcWorkOrderId")
  38. @router.get("/sample-storage-cert-qc/{sample_code}")
  39. async def get_sample_storage_cert_qc(
  40. sample_code: str,
  41. user: dict = Depends(require_any_menu_code(*READ_MENUS)),
  42. db: Session = Depends(get_db),
  43. ):
  44. tenant_no = _get_tenant_no(db, user)
  45. detail = svc.get_detail(db, tenant_no, sample_code)
  46. if detail is None:
  47. return error_response(404, "样本不存在")
  48. return success_response(detail)
  49. @router.put("/sample-storage-cert-qc/{sample_code}")
  50. async def put_sample_storage_cert_qc(
  51. sample_code: str,
  52. body: UpsertBody,
  53. user: dict = Depends(require_strict_any_menu_code(*WRITE_MENUS)),
  54. db: Session = Depends(get_db),
  55. ):
  56. tenant_no = _get_tenant_no(db, user)
  57. user_id = _get_current_user_id(user)
  58. try:
  59. detail = svc.upsert(
  60. db,
  61. tenant_no=tenant_no,
  62. user_id=user_id,
  63. sample_code=sample_code,
  64. payload=body.payload,
  65. qc_work_order_id=body.qc_work_order_id,
  66. )
  67. return success_response(detail, message="保存成功")
  68. except ValueError as e:
  69. return error_response(400, str(e))