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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 货车图片上传功能实现总结
## 实现内容
根据要求已在拜访预约表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. **多语言**: 测试中英文错误提示
货车图片上传功能已完整实现,符合所有要求!