sample_code_correction.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. """样本编码全链路纠错 API"""
  2. from typing import 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_admin_or_super_admin
  8. from app.core.response import error_response, success_response
  9. from app.models.models import SysUser
  10. from app.services import sample_code_correction as svc
  11. from app.services.sample_code_correction import SampleCodeCorrectionError
  12. router = APIRouter(prefix="/web/admin", tags=["样本编码纠错"])
  13. _MENU = require_admin_or_super_admin
  14. def _get_tenant_no(db: Session, user: dict) -> str:
  15. user_id = user.get("user_id")
  16. if not user_id:
  17. raise PermissionError("用户身份信息缺失,无法确定租户")
  18. sys_user = db.query(SysUser).filter(SysUser.id == user_id).first()
  19. if not sys_user or not sys_user.tenant_no:
  20. raise PermissionError("用户租户信息缺失")
  21. return sys_user.tenant_no
  22. def _get_user_id(user: dict) -> str:
  23. user_id = user.get("user_id")
  24. if not user_id:
  25. raise PermissionError("用户身份信息缺失")
  26. return str(user_id)
  27. class SampleCodeCorrectionBody(BaseModel):
  28. model_config = ConfigDict(populate_by_name=True)
  29. reception_source: str = Field(..., alias="receptionSource")
  30. old_sample_code: str = Field(..., alias="oldSampleCode")
  31. new_sample_code: str = Field(..., alias="newSampleCode")
  32. new_sample_code_id: Optional[str] = Field(None, alias="newSampleCodeId")
  33. reason: Optional[str] = None
  34. @router.post("/sample-code-corrections/preview")
  35. async def preview_sample_code_correction(
  36. body: SampleCodeCorrectionBody,
  37. db: Session = Depends(get_db),
  38. user: dict = Depends(_MENU),
  39. ):
  40. try:
  41. tenant_no = _get_tenant_no(db, user)
  42. data = svc.preview_correction(
  43. db,
  44. tenant_no=tenant_no,
  45. reception_source=body.reception_source,
  46. old_sample_code=body.old_sample_code,
  47. new_sample_code=body.new_sample_code,
  48. new_sample_code_id=body.new_sample_code_id,
  49. )
  50. return success_response(data)
  51. except PermissionError as e:
  52. return error_response(str(e))
  53. except Exception as e:
  54. return error_response(f"预览失败: {e}")
  55. @router.post("/sample-code-corrections/apply")
  56. async def apply_sample_code_correction(
  57. body: SampleCodeCorrectionBody,
  58. db: Session = Depends(get_db),
  59. user: dict = Depends(_MENU),
  60. ):
  61. try:
  62. tenant_no = _get_tenant_no(db, user)
  63. user_id = _get_user_id(user)
  64. data = svc.apply_correction(
  65. db,
  66. tenant_no=tenant_no,
  67. reception_source=body.reception_source,
  68. old_sample_code=body.old_sample_code,
  69. new_sample_code=body.new_sample_code,
  70. new_sample_code_id=body.new_sample_code_id,
  71. reason=body.reason,
  72. user_id=user_id,
  73. )
  74. return success_response(data, message="样本编码已更正")
  75. except SampleCodeCorrectionError as e:
  76. db.rollback()
  77. return error_response(str(e))
  78. except PermissionError as e:
  79. db.rollback()
  80. return error_response(str(e))
  81. except Exception as e:
  82. db.rollback()
  83. return error_response(f"更正失败: {e}")