本能力补充 openspec/changes/zkxw-engineering-standards/specs/api-conventions/spec.md 中「JSON 字段命名」要求,专用于 app/api/pl/** 与 web-admin/src/api/pl/**、web-admin/src/views/pl/**。
运输计划模块(路由前缀 /api/transport/**)的请求体、响应体及 Query 参数中,凡前端 TypeScript 使用 camelCase 的多词字段,后端 Pydantic Schema SHALL 通过 Field(..., alias="camelCase") 声明 JSON 别名,并设置 model_config = {"populate_by_name": True}(或 ConfigDict(populate_by_name=True))。
路由层访问请求体 SHALL 使用 Python snake_case 属性名(如 payload.carrier_name),SHALL NOT 使用 payload.carrierName。
读接口(response_model=...Read)SHALL 为 ORM 列对应的 snake_case 字段配置 alias,使 FastAPI 默认 response_model_by_alias=True 输出 camelCase,与 web-admin/src/api/pl/index.ts 类型定义一致。
POST /api/transport/carrier 请求体为 { "carrierName": "某某物流", "contactName": "张三", "status": "1" }CarrierCreate SHALL 校验通过(HTTP 非 422)payload.carrier_name 写入 pl_carrier.carrier_namePOST /api/transport/plan/ 请求体含 belongsCompany、planType、planDate 及 products[].productIdPlanCreate / PlanProductCreate SHALL 校验通过PlanRead / PlanProductRead 的 JSON 键 SHALL 为 planNo、createTime 等 camelCasePOST /api/transport/order/arrange/{planId} 请求体为 { "vehicleId": "...", "driverId": "...", "freightType": "by_weight" }TransportArrange SHALL 校验通过payload.vehicle_id、payload.driver_id 访问字段page=1&pageSize=20&planType=directQuery(..., alias="pageSize") 或 Schema alias 正确解析pageSize 导致始终使用默认每页 20 条app/schemas/pl/** 中 Write/Read Schema 的多词字段仅有 snake_case 属性名、无 alias修改 app/schemas/pl/** 或新增 PL 写接口时,提交前 SHALL 运行 python backend/scripts/check_pl_json_aliases.py;脚本失败 SHALL 阻塞合并。
Schema 覆盖范围 SHALL 至少包括:
| 路径 | 说明 |
|---|---|
app/schemas/pl/__init__.py |
承运商、车辆、司机 |
app/schemas/pl/plan.py |
计划与产品明细 |
app/schemas/pl/transport.py |
运输、安排、审批 |
app/schemas/pl/freight.py |
运费结算 |
app/schemas/pl/inventory.py |
库存、证件提醒 |
参考实现:app/schemas/db/weighing.py(地磅模块 alias 模式)。