research_donation_sample_collection.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. """科研捐赠样本采集信息 API"""
  2. from typing import Optional
  3. from fastapi import APIRouter, Depends, Query
  4. from sqlalchemy.orm import Session
  5. from app.core.database import get_db
  6. from app.core.menu_guard import require_any_menu_code
  7. from app.core.response import error_response, success_response
  8. from app.crud import research_donation_sample_collection as svc
  9. from app.crud.research_donation_sample_collection import total_pages
  10. from app.models.models import SysUser
  11. router = APIRouter(prefix="/web/admin", tags=["科研捐赠样本采集信息"])
  12. _SAMPLE_INFO_MENU = require_any_menu_code(
  13. "research-donation:sample-info:list",
  14. )
  15. def _get_tenant_no(db: Session, user: dict) -> str:
  16. user_id = user.get("user_id")
  17. if not user_id:
  18. raise PermissionError("用户身份信息缺失,无法确定租户")
  19. sys_user = db.query(SysUser).filter(SysUser.id == user_id).first()
  20. if not sys_user or not sys_user.tenant_no:
  21. raise PermissionError("用户租户信息缺失")
  22. return sys_user.tenant_no
  23. def _page_payload(items: list, total: int, page: int, page_size: int) -> dict:
  24. return {
  25. "list": items,
  26. "total": total,
  27. "page": page,
  28. "pageSize": page_size,
  29. "totalPages": total_pages(total, page_size),
  30. }
  31. @router.get("/research-donation-sample-collections/list")
  32. async def list_donation_sample_collections(
  33. page: int = Query(1, ge=1),
  34. pageSize: int = Query(10, ge=1, le=100),
  35. keyword: Optional[str] = None,
  36. sampleStatus: Optional[str] = Query(None, alias="sampleStatus"),
  37. collectionFlag: Optional[str] = Query(None, alias="collectionFlag"),
  38. receptionFlag: Optional[str] = Query(None, alias="receptionFlag"),
  39. qcFlag: Optional[str] = Query(None, alias="qcFlag"),
  40. storageFlag: Optional[str] = Query(None, alias="storageFlag"),
  41. db: Session = Depends(get_db),
  42. user: dict = Depends(_SAMPLE_INFO_MENU),
  43. ):
  44. try:
  45. tenant_no = _get_tenant_no(db, user)
  46. items, total = svc.list_donation_sample_collections(
  47. db,
  48. page=page,
  49. page_size=pageSize,
  50. tenant_no=tenant_no,
  51. keyword=keyword,
  52. sample_status=sampleStatus,
  53. collection_flag=collectionFlag,
  54. reception_flag=receptionFlag,
  55. qc_flag=qcFlag,
  56. storage_flag=storageFlag,
  57. user_info=user,
  58. )
  59. return success_response(_page_payload(items, total, page, pageSize))
  60. except PermissionError as e:
  61. return error_response(403, str(e))
  62. except Exception as e:
  63. return error_response(400, str(e))