diff --git a/.gitignore b/.gitignore
index 6e4883e98..29f9af310 100644
--- a/.gitignore
+++ b/.gitignore
@@ -84,3 +84,4 @@ exports/
# uni-app 编译产物
miniprogram/unpackage/
+.superpowers/
diff --git a/docs/fresh-mint-pl-vehicle-personnel-photo-demo.html b/docs/fresh-mint-pl-vehicle-personnel-photo-demo.html
new file mode 100644
index 000000000..fb60372de
--- /dev/null
+++ b/docs/fresh-mint-pl-vehicle-personnel-photo-demo.html
@@ -0,0 +1,759 @@
+
+
+
+
+
+
+
+
+
1. 覆盖范围 两表四页
+
底层两张表各加一字段;四个页面共用同一套上传控件(AttachmentUploadField,limit=1,accept=image/*)。
+
+
+
+
三方车辆
+
表 pl_vehicle
字段建议 photo_urls
+
+
+
山峡自有车辆
+
同表 pl_vehicle
车辆照片
+
+
+
三方驾押人员
+
表 pl_personnel
字段建议 photo_urls
+
+
+
山峡驾押人员
+
同表 pl_personnel
人员照片
+
+
+
+ 存储约定:与现有附件一致,库字段存逗号分隔 URL;前端 limit=1,实际默认只保留一张。上传 folder 建议:
+ pl/vehicle-photo / pl/personnel-photo。
+
+
+
+
+
+
2. 列表展示形态 请点选
+
照片列放在主标识列(车牌号 / 姓名)附近。请选择更偏好的列表展示方式。
+
+
+
+
+
+
方案 A · 方形缩略图(推荐)
+
48×48,object-fit: cover,无图显示「未上传」
+
+
+
+
+
+
三方车辆
+
+ + 新增车辆
+ 编辑
+
+
+
+
+
+
+
+
+
+
方案 B · 附件卡片紧凑态
+
对齐证书附件列样式,略扁的预览卡
+
+
+
+
+
+
山峡驾押人员
+
+ + 新增人员
+ 编辑
+
+
+
+
+ | 照片 |
+ 姓名 |
+ 类型 |
+ 状态 |
+
+
+
+
+
+
+ |
+ 王驾驶 |
+ 驾驶员 |
+ 在职 |
+
+
+ | — |
+ 李押运 |
+ 押运员 |
+ 在职 |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4. 查看弹窗中的照片
+
只读预览:左侧大图,右侧基础信息;无图时显示占位。
+
+
+
+

+
+ - 姓名
- 王驾驶
+ - 手机号
- 13089012212
+ - 人员类型
- 驾驶员
+ - 归属
- 山峡驾押人员
+ - 状态
- 在职
+
+
+
+
+
+
+
+ 当前选择:列表 方案 A · 方形缩略图 · 校验 非必填
+
+
文件:docs/fresh-mint-pl-vehicle-personnel-photo-demo.html
+
+
+
+
+
+
diff --git a/docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md b/docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md
new file mode 100644
index 000000000..1e789e7bc
--- /dev/null
+++ b/docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md
@@ -0,0 +1,200 @@
+# 运输计划 · 车辆/驾押人员照片字段 — 设计文档
+
+> **日期**: 2026-08-02
+> **状态**: 待审阅
+> **Demo**: `docs/fresh-mint-pl-vehicle-personnel-photo-demo.html`
+> **页面**:
+> - 三方车辆 `web-admin` `/#/pl/vehicle` → `src/views/pl/vehicle/index.vue`
+> - 山峡自有车辆 `/#/pl/self-vehicle` → `src/views/pl/self-vehicle/index.vue`
+> - 三方/山峡驾押人员 `/#/pl/personnel*` → `src/views/pl/personnel/index.vue`(归属模式共用)
+
+## 目标
+
+为车辆档案与驾押人员档案各增加一个**照片**字段,默认只存 **1 张**图片(MinIO URL),用于列表识别与档案查看。
+
+覆盖范围:
+
+1. 三方车辆、山峡自有车辆(同一张表 `pl_vehicle`)
+2. 三方驾押人员、山峡驾押人员(同一张表 `pl_personnel`)
+
+## 已确认业务规则
+
+| 规则 | 决策 |
+|------|------|
+| 存储形态 | 路径 2:`photo_urls`(逗号分隔 URL),前端 `limit=1` |
+| 列表展示 | 方案 A:48×48 方形缩略图;无图显示「未上传」 |
+| 是否必填 | **非必填**(可先建档后补图) |
+| 文件类型 | 仅图片(`accept="image/*"`) |
+| 数量 | 默认 1 张;前端硬限制 1;后端不强制必填 |
+| 上传组件 | 复用 `AttachmentUploadField`(卡片化布局) |
+| 上传目录 | 车辆 `pl/vehicle-photo`;人员 `pl/personnel-photo` |
+
+## 非目标(本期不做)
+
+- 多图相册、主图/附图切换
+- 照片 OCR / 人脸比对
+- 强制历史数据补图
+- MinIO 孤儿文件清理
+- 小程序端同步改造(除非后续单独需求)
+
+---
+
+## 方案选型
+
+**采用路径 2:`photo_urls` 字段 + 前端 limit=1**
+
+| 对比项 | `photo_url` 单 URL | `photo_urls`(采用) | 挂到证书附件 |
+|--------|-------------------|----------------------|--------------|
+| 与附件组件一致性 | 弱 | 强 | 职责混淆 |
+| 扩展多图 | 需改字段 | 仅调 limit | 不合适 |
+| 语义 | 更直观 | 字段名带 s | — |
+
+---
+
+## 数据模型变更
+
+### `pl_vehicle` 新增列
+
+放在 `vehicle_status` 与 `tenant_no` 之间:
+
+```sql
+ALTER TABLE `pl_vehicle`
+ ADD COLUMN `photo_urls` varchar(2000) DEFAULT NULL COMMENT '车辆照片URL,逗号分隔(默认1张)' AFTER `vehicle_status`;
+```
+
+### `pl_personnel` 新增列
+
+放在 `status` 与 `tenant_no` 之间:
+
+```sql
+ALTER TABLE `pl_personnel`
+ ADD COLUMN `photo_urls` varchar(2000) DEFAULT NULL COMMENT '人员照片URL,逗号分隔(默认1张)' AFTER `status`;
+```
+
+同步更新:
+
+- `docs/sql/shanxia2.0.sql`
+- 迁移脚本:`backend/scripts/migrate_20260802_pl_vehicle_personnel_photo_urls.sql`
+- ORM:`backend/app/models/pl_models.py` 中 `PlVehicle` / `PlPersonnel`
+
+---
+
+## 后端设计
+
+### Schema(`backend/app/schemas/pl/base_data.py`)
+
+| Schema | 变更 |
+|--------|------|
+| `VehicleBase` | 增加可选 `photo_urls: Optional[str]`,alias `photoUrls`,`max_length=2000` |
+| `VehicleUpdate` | 同上(optional) |
+| `PersonnelBase` | 同上 |
+| `PersonnelUpdate` | 同上 |
+
+`VehicleRead` / `PersonnelRead` 经 Base 或显式字段带出 `photoUrls`;`model_validate(vehicle)` 即可自动映射 ORM 列。
+
+### API(`backend/app/api/pl/base_data.py`)
+
+| 接口 | 变更 |
+|------|------|
+| `POST /transport/vehicle` | `PlVehicle(..., photo_urls=payload.photo_urls)` |
+| `PUT /transport/vehicle/{id}` | `model_dump(exclude_unset=True)` 已含 `photo_urls` 时 setattr |
+| `GET` list/detail vehicle | Read 自动带 `photoUrls` |
+| `POST /transport/personnel` | 写入 `photo_urls` |
+| `PUT /transport/personnel/{id}` | 同上 |
+| `GET` list/detail personnel | Read 自动带 `photoUrls` |
+
+**校验**
+
+- 不校验非空(非必填)
+- 不在后端截断多 URL;前端保证最多 1 张。若未来需要,可在 service 层取第一段 URL(本期不做)
+
+**字段一致性**
+
+Create/Update Body 与前端 `formData` / Payload 均包含 `photoUrls`,与 Read 对齐;实现后可跑 `python scripts/check_field_consistency.py`(若该检查已覆盖 PL 实体)。
+
+---
+
+## 前端设计
+
+### 类型(`web-admin/src/api/pl/index.ts`)
+
+`Vehicle` / `VehiclePayload` / `Personnel` / `PersonnelPayload` 增加:
+
+```ts
+photoUrls?: string
+```
+
+### 列表(方案 A)
+
+四页(车辆两页 + 人员一页双模式)在主标识列附近增加「照片」列:
+
+- 有 URL:`