product_parameter_value.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. """API - 商品参数值管理"""
  2. from fastapi import APIRouter, Depends, HTTPException, Request
  3. from pydantic import ValidationError
  4. from sqlalchemy.orm import Session
  5. from app.core.database import get_db
  6. from app.core.auth import get_current_user
  7. from app.core.admin_request_json import parse_admin_request_json
  8. from app.core.response import success_response, error_response
  9. from app.crud.product_parameter_value import product_parameter_value
  10. from app.schemas.product_parameter_value import ProductParameterValueBatchSave
  11. router = APIRouter(prefix="/web/admin/product-parameter-values", tags=["商品参数值管理"])
  12. def require_admin(current_user: dict = Depends(get_current_user)):
  13. """验证运营人员权限"""
  14. if current_user.get("role") not in {"admin", "super_admin"}:
  15. raise HTTPException(status_code=403, detail="需要运营人员权限")
  16. return current_user
  17. @router.get("/product/{product_id}", response_model=dict)
  18. def get_product_parameter_values(
  19. product_id: str,
  20. db: Session = Depends(get_db),
  21. current_user: dict = Depends(require_admin)
  22. ):
  23. """获取商品的参数值"""
  24. values = product_parameter_value.get_by_product_with_detail(db, product_id)
  25. return success_response({
  26. "list": values,
  27. "total": len(values)
  28. })
  29. @router.post("/product/{product_id}", response_model=dict)
  30. async def save_product_parameter_values(
  31. product_id: str,
  32. request: Request,
  33. db: Session = Depends(get_db),
  34. current_user: dict = Depends(require_admin)
  35. ):
  36. """批量保存商品参数值(兼容密文信封)"""
  37. data, err = await parse_admin_request_json(
  38. request, current_user, source="admin_product_parameter_values"
  39. )
  40. if err:
  41. return error_response(400, err)
  42. if not isinstance(data, dict):
  43. return error_response(400, "请求体格式错误")
  44. try:
  45. save_data = ProductParameterValueBatchSave.model_validate(data)
  46. except ValidationError as exc:
  47. return error_response(400, str(exc))
  48. if save_data.product_id != product_id:
  49. return error_response(400, "请求体中的商品ID与路径不一致")
  50. creator = {"user_id": current_user.get("user_id"), "real_name": current_user.get("real_name")}
  51. values_data = [item.model_dump() for item in save_data.values]
  52. product_parameter_value.batch_save(db, product_id, values_data, creator)
  53. # 重新获取更新后的列表
  54. values = product_parameter_value.get_by_product_with_detail(db, product_id)
  55. return success_response({
  56. "list": values,
  57. "total": len(values)
  58. })