storage_release_review.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. db: Session = Depends(get_db),
  39. user: dict = Depends(require_menu_code("biz:storageReleaseReview:list")),
  40. ):
  41. try:
  42. tenant_no = _get_tenant_no(db, user)
  43. result = srr_svc.list_reviews(
  44. db,
  45. tenant_no=tenant_no,
  46. page=page,
  47. page_size=pageSize,
  48. reception_source=receptionSource,
  49. review_conclusion=reviewConclusion,
  50. storage_status=storageStatus,
  51. keyword=keyword,
  52. review_phase=reviewPhase,
  53. qc_work_order_completed=qcWorkOrderCompleted,
  54. user_info=user,
  55. )
  56. return success_response(result)
  57. except PermissionError as e:
  58. return error_response(403, str(e))
  59. except Exception as e:
  60. return error_response(400, str(e))
  61. @router.get("/storage-release-reviews/{review_id}")
  62. async def get_storage_release_review_detail(
  63. review_id: str,
  64. db: Session = Depends(get_db),
  65. user: dict = Depends(require_menu_code("biz:storageReleaseReview:list")),
  66. ):
  67. try:
  68. tenant_no = _get_tenant_no(db, user)
  69. detail = srr_svc.get_review_detail(db, review_id, tenant_no)
  70. if not detail:
  71. return error_response(404, "审核记录不存在")
  72. return success_response(detail)
  73. except PermissionError as e:
  74. return error_response(403, str(e))
  75. except Exception as e:
  76. return error_response(400, str(e))
  77. @router.put("/storage-release-reviews/{review_id}/review")
  78. async def submit_single_review(
  79. review_id: str,
  80. body: ReviewSubmitBody,
  81. db: Session = Depends(get_db),
  82. user: dict = Depends(require_admin_or_super_admin),
  83. ):
  84. try:
  85. tenant_no = _get_tenant_no(db, user)
  86. user_id = _get_current_user_id(user)
  87. rev = srr_svc.submit_review(
  88. db,
  89. review_id,
  90. review_conclusion=body.reviewConclusion,
  91. review_remark=body.reviewRemark,
  92. review_attachments=body.reviewAttachments,
  93. tenant_no=tenant_no,
  94. user_id=user_id,
  95. )
  96. db.commit()
  97. return success_response(srr_svc._row_to_dict(rev))
  98. except PermissionError as e:
  99. return error_response(403, str(e))
  100. except ValueError as e:
  101. return error_response(400, str(e))
  102. except Exception as e:
  103. return error_response(400, str(e))
  104. @router.put("/storage-release-reviews/batch-review")
  105. async def batch_review(
  106. body: BatchReviewBody,
  107. db: Session = Depends(get_db),
  108. user: dict = Depends(require_admin_or_super_admin),
  109. ):
  110. try:
  111. tenant_no = _get_tenant_no(db, user)
  112. user_id = _get_current_user_id(user)
  113. result = srr_svc.batch_submit_review(
  114. db,
  115. body.ids,
  116. review_conclusion=body.reviewConclusion,
  117. review_remark=body.reviewRemark,
  118. review_attachments=body.reviewAttachments,
  119. tenant_no=tenant_no,
  120. user_id=user_id,
  121. )
  122. db.commit()
  123. return success_response(result)
  124. except PermissionError as e:
  125. return error_response(403, str(e))
  126. except ValueError as e:
  127. return error_response(400, str(e))
  128. except Exception as e:
  129. return error_response(400, str(e))
  130. @router.put("/storage-release-reviews/{review_id}/store")
  131. async def store_single_sample(
  132. review_id: str,
  133. db: Session = Depends(get_db),
  134. user: dict = Depends(require_admin_or_super_admin),
  135. ):
  136. try:
  137. tenant_no = _get_tenant_no(db, user)
  138. user_id = _get_current_user_id(user)
  139. rev = srr_svc.store_sample(
  140. db,
  141. review_id,
  142. tenant_no=tenant_no,
  143. user_id=user_id,
  144. )
  145. db.commit()
  146. return success_response(srr_svc._row_to_dict(rev))
  147. except PermissionError as e:
  148. return error_response(403, str(e))
  149. except ValueError as e:
  150. return error_response(400, str(e))
  151. except Exception as e:
  152. return error_response(400, str(e))
  153. @router.put("/storage-release-reviews/batch-store")
  154. async def batch_store_samples(
  155. body: BatchStoreBody,
  156. db: Session = Depends(get_db),
  157. user: dict = Depends(require_admin_or_super_admin),
  158. ):
  159. try:
  160. tenant_no = _get_tenant_no(db, user)
  161. user_id = _get_current_user_id(user)
  162. result = srr_svc.batch_store_samples(
  163. db,
  164. body.ids,
  165. tenant_no=tenant_no,
  166. user_id=user_id,
  167. )
  168. db.commit()
  169. return success_response(result)
  170. except PermissionError as e:
  171. return error_response(403, str(e))
  172. except ValueError as e:
  173. return error_response(400, str(e))
  174. except Exception as e:
  175. return error_response(400, str(e))