pre_transit_sample.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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_menu_code
  7. from app.core.response import error_response, success_response
  8. from app.crud import pre_transit_sample as pts_svc
  9. from app.models.models import SysUser
  10. router = APIRouter(prefix="/web/admin", tags=["质量检测"])
  11. def _get_tenant_no(db: Session, user: dict) -> str:
  12. user_id = user.get("user_id")
  13. if not user_id:
  14. raise PermissionError("用户身份信息缺失,无法确定租户")
  15. sys_user = db.query(SysUser).filter(SysUser.id == user_id).first()
  16. if not sys_user or not sys_user.tenant_no:
  17. raise PermissionError("用户租户信息缺失")
  18. return sys_user.tenant_no
  19. def _page_payload(items: list, total: int, page: int, page_size: int) -> dict:
  20. return {
  21. "list": items,
  22. "total": total,
  23. "page": page,
  24. "pageSize": page_size,
  25. "totalPages": pts_svc.total_pages(total, page_size),
  26. }
  27. @router.get("/pre-transit-samples/in-transit")
  28. async def list_in_transit_samples(
  29. page: int = Query(1, ge=1),
  30. pageSize: int = Query(10, ge=1, le=100),
  31. keyword: Optional[str] = None,
  32. sourceType: Optional[str] = None,
  33. createTimeStart: Optional[str] = Query(None, alias="createTimeStart"),
  34. createTimeEnd: Optional[str] = Query(None, alias="createTimeEnd"),
  35. sampleCollectTimeStart: Optional[str] = Query(None, alias="sampleCollectTimeStart"),
  36. sampleCollectTimeEnd: Optional[str] = Query(None, alias="sampleCollectTimeEnd"),
  37. db: Session = Depends(get_db),
  38. user: dict = Depends(require_menu_code("biz:preTransitSample:list")),
  39. ):
  40. try:
  41. tenant_no = _get_tenant_no(db, user)
  42. items, total = pts_svc.list_in_transit_protocols(
  43. db,
  44. page=page,
  45. page_size=pageSize,
  46. tenant_no=tenant_no,
  47. keyword=keyword,
  48. source_type=sourceType,
  49. create_time_start=createTimeStart,
  50. create_time_end=createTimeEnd,
  51. sample_collect_time_start=sampleCollectTimeStart,
  52. sample_collect_time_end=sampleCollectTimeEnd,
  53. user_info=user,
  54. )
  55. return success_response(_page_payload(items, total, page, pageSize))
  56. except PermissionError as e:
  57. return error_response(403, str(e))
  58. except Exception as e:
  59. return error_response(400, str(e))
  60. @router.get("/pre-transit-samples/pre-delivery")
  61. async def list_pre_delivery_samples(
  62. page: int = Query(1, ge=1),
  63. pageSize: int = Query(10, ge=1, le=100),
  64. keyword: Optional[str] = None,
  65. sourceType: Optional[str] = None,
  66. createTimeStart: Optional[str] = Query(None, alias="createTimeStart"),
  67. createTimeEnd: Optional[str] = Query(None, alias="createTimeEnd"),
  68. sampleCollectTimeStart: Optional[str] = Query(None, alias="sampleCollectTimeStart"),
  69. sampleCollectTimeEnd: Optional[str] = Query(None, alias="sampleCollectTimeEnd"),
  70. db: Session = Depends(get_db),
  71. user: dict = Depends(require_menu_code("biz:preTransitSample:list")),
  72. ):
  73. try:
  74. tenant_no = _get_tenant_no(db, user)
  75. items, total = pts_svc.list_pre_delivery_protocols(
  76. db,
  77. page=page,
  78. page_size=pageSize,
  79. tenant_no=tenant_no,
  80. keyword=keyword,
  81. source_type=sourceType,
  82. create_time_start=createTimeStart,
  83. create_time_end=createTimeEnd,
  84. sample_collect_time_start=sampleCollectTimeStart,
  85. sample_collect_time_end=sampleCollectTimeEnd,
  86. user_info=user,
  87. )
  88. return success_response(_page_payload(items, total, page, pageSize))
  89. except PermissionError as e:
  90. return error_response(403, str(e))
  91. except Exception as e:
  92. return error_response(400, str(e))