storage_release_review.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. from typing import Optional
  2. from fastapi import APIRouter, Depends, Query
  3. from sqlalchemy.orm import Session
  4. from app.core.database import get_db
  5. from app.core.menu_guard import require_admin_or_super_admin, require_menu_code
  6. from app.core.response import error_response, success_response
  7. from app.crud import storage_release_review as srr_svc
  8. from app.models.models import SysUser
  9. from app.schemas.storage_release_review import (
  10. BatchReviewBody,
  11. BatchStoreBody,
  12. ReviewSubmitBody,
  13. )
  14. router = APIRouter(prefix="/web/admin", tags=["入库放行审核"])
  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 _get_current_user_id(user: dict) -> str:
  24. user_id = user.get("user_id")
  25. if not user_id:
  26. raise PermissionError("用户身份信息缺失")
  27. return str(user_id)
  28. @router.get("/storage-release-reviews")
  29. async def list_storage_release_reviews(
  30. page: int = Query(1, ge=1),
  31. pageSize: int = Query(10, ge=1, le=100),
  32. keyword: Optional[str] = None,
  33. receptionSource: Optional[str] = None,
  34. reviewConclusion: Optional[str] = None,
  35. storageStatus: Optional[str] = None,
  36. reviewPhase: Optional[str] = None,
  37. qcWorkOrderCompleted: Optional[bool] = Query(None),
  38. readyForReviewOnly: Optional[bool] = Query(None),
  39. db: Session = Depends(get_db),
  40. user: dict = Depends(require_menu_code("biz:storageReleaseReview:list")),
  41. ):
  42. try:
  43. tenant_no = _get_tenant_no(db, user)
  44. result = srr_svc.list_reviews(
  45. db,
  46. tenant_no=tenant_no,
  47. page=page,
  48. page_size=pageSize,
  49. reception_source=receptionSource,
  50. review_conclusion=reviewConclusion,
  51. storage_status=storageStatus,
  52. keyword=keyword,
  53. review_phase=reviewPhase,
  54. qc_work_order_completed=qcWorkOrderCompleted,
  55. ready_for_review_only=readyForReviewOnly,
  56. user_info=user,
  57. )
  58. return success_response(result)
  59. except PermissionError as e:
  60. return error_response(403, str(e))
  61. except Exception as e:
  62. return error_response(400, str(e))
  63. @router.get("/storage-release-reviews/{review_id}")
  64. async def get_storage_release_review_detail(
  65. review_id: str,
  66. db: Session = Depends(get_db),
  67. user: dict = Depends(require_menu_code("biz:storageReleaseReview:list")),
  68. ):
  69. try:
  70. tenant_no = _get_tenant_no(db, user)
  71. detail = srr_svc.get_review_detail(db, review_id, tenant_no)
  72. if not detail:
  73. return error_response(404, "审核记录不存在")
  74. return success_response(detail)
  75. except PermissionError as e:
  76. return error_response(403, str(e))
  77. except Exception as e:
  78. return error_response(400, str(e))
  79. @router.put("/storage-release-reviews/{review_id}/review")
  80. async def submit_single_review(
  81. review_id: str,
  82. body: ReviewSubmitBody,
  83. db: Session = Depends(get_db),
  84. user: dict = Depends(require_admin_or_super_admin),
  85. ):
  86. try:
  87. tenant_no = _get_tenant_no(db, user)
  88. user_id = _get_current_user_id(user)
  89. rev = srr_svc.submit_review(
  90. db,
  91. review_id,
  92. review_conclusion=body.reviewConclusion,
  93. review_remark=body.reviewRemark,
  94. review_attachments=body.reviewAttachments,
  95. tenant_no=tenant_no,
  96. user_id=user_id,
  97. )
  98. db.commit()
  99. return success_response(srr_svc._row_to_dict(rev))
  100. except PermissionError as e:
  101. return error_response(403, str(e))
  102. except ValueError as e:
  103. return error_response(400, str(e))
  104. except Exception as e:
  105. return error_response(400, str(e))
  106. @router.put("/storage-release-reviews/batch-review")
  107. async def batch_review(
  108. body: BatchReviewBody,
  109. db: Session = Depends(get_db),
  110. user: dict = Depends(require_admin_or_super_admin),
  111. ):
  112. try:
  113. tenant_no = _get_tenant_no(db, user)
  114. user_id = _get_current_user_id(user)
  115. result = srr_svc.batch_submit_review(
  116. db,
  117. body.ids,
  118. review_conclusion=body.reviewConclusion,
  119. review_remark=body.reviewRemark,
  120. review_attachments=body.reviewAttachments,
  121. tenant_no=tenant_no,
  122. user_id=user_id,
  123. )
  124. db.commit()
  125. return success_response(result)
  126. except PermissionError as e:
  127. return error_response(403, str(e))
  128. except ValueError as e:
  129. return error_response(400, str(e))
  130. except Exception as e:
  131. return error_response(400, str(e))
  132. @router.put("/storage-release-reviews/{review_id}/store")
  133. async def store_single_sample(
  134. review_id: str,
  135. db: Session = Depends(get_db),
  136. user: dict = Depends(require_admin_or_super_admin),
  137. ):
  138. try:
  139. tenant_no = _get_tenant_no(db, user)
  140. user_id = _get_current_user_id(user)
  141. rev = srr_svc.store_sample(
  142. db,
  143. review_id,
  144. tenant_no=tenant_no,
  145. user_id=user_id,
  146. )
  147. db.commit()
  148. return success_response(srr_svc._row_to_dict(rev))
  149. except PermissionError as e:
  150. return error_response(403, str(e))
  151. except ValueError as e:
  152. return error_response(400, str(e))
  153. except Exception as e:
  154. return error_response(400, str(e))
  155. @router.put("/storage-release-reviews/batch-store")
  156. async def batch_store_samples(
  157. body: BatchStoreBody,
  158. db: Session = Depends(get_db),
  159. user: dict = Depends(require_admin_or_super_admin),
  160. ):
  161. try:
  162. tenant_no = _get_tenant_no(db, user)
  163. user_id = _get_current_user_id(user)
  164. result = srr_svc.batch_store_samples(
  165. db,
  166. body.ids,
  167. tenant_no=tenant_no,
  168. user_id=user_id,
  169. )
  170. db.commit()
  171. return success_response(result)
  172. except PermissionError as e:
  173. return error_response(403, str(e))
  174. except ValueError as e:
  175. return error_response(400, str(e))
  176. except Exception as e:
  177. return error_response(400, str(e))