You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ss-visit/VEHICLE_IMAGES_IMPLEMENTATI...

177 lines
4.6 KiB

11 months ago
# 货车图片上传功能实现总结
## 实现内容
根据要求已在拜访预约表visits表中增加了json字段来存储货车图片并完善了相关的上传逻辑。
## 数据库变更
### 1. 新增字段
- **字段名**: `vehicle_images`
- **类型**: `json`
- **说明**: 存储货车图片的uploads表id数组
- **迁移文件**: `2025_09_09_112040_add_vehicle_images_to_visits_table.php`
### 2. 字段设计
```sql
ALTER TABLE visits ADD COLUMN vehicle_images JSON NULL COMMENT '货车图片id数组';
```
## 模型更新
### Visit模型更新
1. **类型转换**: 在`$casts`中添加了`'vehicle_images' => 'array'`
2. **关联关系**: 添加了`getVehicleImagesAttribute()`方法
```php
// 类型转换
protected $casts = [
'vehicle_images' => 'array',
// ... 其他字段
];
// 获取货车图片列表(多文件)
public function getVehicleImagesAttribute()
{
if (!$this->vehicle_images) {
return [];
}
return Upload::whereIn('id', $this->vehicle_images)->get();
}
```
## 控制器更新
### GateController更新
1. **添加Upload模型引用**
2. **完善upload_vehicle操作逻辑**
3. **更新Swagger文档**
```php
case 'upload_vehicle':
// 上传货车图片
if ($visit->type != Visit::TYPE_LOGISTICS_CAR) {
return $this->error(__('gate.only_logistics_cars_can_upload_images'));
}
$vehicleImages = $request->input('vehicle_images', []);
if (empty($vehicleImages)) {
return $this->error(__('gate.vehicle_images_required'));
}
// 验证图片ID是否存在于uploads表中
$existingImages = Upload::whereIn('id', $vehicleImages)->pluck('id')->toArray();
if (count($existingImages) !== count($vehicleImages)) {
return $this->error(__('gate.invalid_vehicle_images'));
}
// 存储货车图片ID数组到vehicle_images字段
$visit->vehicle_images = $vehicleImages;
$visit->save();
// 记录日志
$this->createVisitLog($visit, VisitLog::TYPE_ENTER, __('gate.upload_vehicle_images_log', ['count' => count($vehicleImages)]));
break;
```
## API接口
### 上传货车图片接口
- **路径**: `POST /api/gate/visits/{id}/update`
- **参数**:
```json
{
"action": "upload_vehicle",
"vehicle_images": [123, 456, 789]
}
```
### Swagger文档更新
```php
@OA\Property(property="vehicle_images", type="array", description="货车图片ID数组上传货车图片时必填", @OA\Items(type="integer"))
```
## 多语言支持
### 中文翻译 (lang/zh-CN/gate.php)
```php
'invalid_vehicle_images' => '货车图片ID无效',
```
### 英文翻译 (lang/en/gate.php)
```php
'invalid_vehicle_images' => 'Invalid vehicle image IDs',
```
## 使用方式
### 1. 上传货车图片
```php
// 通过API上传
POST /api/gate/visits/123/update
{
"action": "upload_vehicle",
"vehicle_images": [123, 456, 789]
}
```
### 2. 获取货车图片
```php
// 获取拜访记录及货车图片
$visit = Visit::with('acceptAdminSign')->find(123);
$vehicleImages = $visit->vehicle_images; // 返回Upload模型集合
```
### 3. API返回数据格式
```json
{
"id": 123,
"name": "访客姓名",
"type": 3,
"vehicle_images": [
{
"id": 123,
"original_name": "vehicle1.jpg",
"url": "http://domain.com/uploads/vehicle1.jpg"
},
{
"id": 456,
"original_name": "vehicle2.jpg",
"url": "http://domain.com/uploads/vehicle2.jpg"
}
]
}
```
## 验证逻辑
1. **类型验证**: 只有物流车辆type=3才能上传货车图片
2. **必填验证**: vehicle_images参数不能为空
3. **存在性验证**: 验证所有图片ID是否存在于uploads表中
4. **数据存储**: 将验证通过的图片ID数组存储到vehicle_images字段
## 日志记录
上传货车图片时会自动记录操作日志:
- **日志类型**: VisitLog::TYPE_ENTER
- **日志内容**: "上传货车图片:{图片数量}张"
## 注意事项
1. **文件存储**: 所有图片都存储在uploads表中通过id关联
2. **权限控制**: 只有物流车辆类型的拜访才能上传货车图片
3. **数据验证**: 严格验证图片ID的有效性
4. **日志记录**: 所有操作都有完整的日志记录
5. **多语言**: 支持中英双语错误提示
## 测试建议
1. **正常上传**: 测试物流车辆上传多张货车图片
2. **权限验证**: 测试非物流车辆尝试上传图片
3. **数据验证**: 测试无效的图片ID
4. **空值处理**: 测试空的vehicle_images参数
5. **多语言**: 测试中英文错误提示
货车图片上传功能已完整实现,符合所有要求!