"""API - 商品参数值管理""" from fastapi import APIRouter, Depends, HTTPException, Request from pydantic import ValidationError from sqlalchemy.orm import Session from app.core.database import get_db from app.core.auth import get_current_user from app.core.admin_request_json import parse_admin_request_json from app.core.response import success_response, error_response from app.crud.product_parameter_value import product_parameter_value from app.schemas.product_parameter_value import ProductParameterValueBatchSave router = APIRouter(prefix="/web/admin/product-parameter-values", tags=["商品参数值管理"]) def require_admin(current_user: dict = Depends(get_current_user)): """验证运营人员权限""" if current_user.get("role") not in {"admin", "super_admin"}: raise HTTPException(status_code=403, detail="需要运营人员权限") return current_user @router.get("/product/{product_id}", response_model=dict) def get_product_parameter_values( product_id: str, db: Session = Depends(get_db), current_user: dict = Depends(require_admin) ): """获取商品的参数值""" values = product_parameter_value.get_by_product_with_detail(db, product_id) return success_response({ "list": values, "total": len(values) }) @router.post("/product/{product_id}", response_model=dict) async def save_product_parameter_values( product_id: str, request: Request, db: Session = Depends(get_db), current_user: dict = Depends(require_admin) ): """批量保存商品参数值(兼容密文信封)""" data, err = await parse_admin_request_json( request, current_user, source="admin_product_parameter_values" ) if err: return error_response(400, err) if not isinstance(data, dict): return error_response(400, "请求体格式错误") try: save_data = ProductParameterValueBatchSave.model_validate(data) except ValidationError as exc: return error_response(400, str(exc)) if save_data.product_id != product_id: return error_response(400, "请求体中的商品ID与路径不一致") creator = {"user_id": current_user.get("user_id"), "real_name": current_user.get("real_name")} values_data = [item.model_dump() for item in save_data.values] product_parameter_value.batch_save(db, product_id, values_data, creator) # 重新获取更新后的列表 values = product_parameter_value.get_by_product_with_detail(db, product_id) return success_response({ "list": values, "total": len(values) })