2025-04-30 11:30:08 +08:00
<? php
2025-05-06 17:16:37 +08:00
declare ( strict_types = 1 );
2025-04-30 11:30:08 +08:00
namespace plugin\admin\app\controller ;
2025-05-07 14:19:47 +08:00
use app\model\LocationAr ;
use app\model\LocationEn ;
use app\model\LocationRu ;
use app\model\VehicleAr ;
use app\model\VehicleEn ;
use app\model\VehicleRu ;
2025-04-30 14:00:54 +08:00
use app\service\OssService ;
2025-05-13 15:29:30 +08:00
use plugin\admin\app\common\Util ;
2025-04-30 11:30:08 +08:00
use plugin\admin\app\model\Location ;
2025-04-30 14:51:12 +08:00
use support\Log ;
2025-04-30 11:30:08 +08:00
use support\Request ;
use support\Response ;
use plugin\admin\app\model\Vehicle ;
use plugin\admin\app\controller\Crud ;
use support\exception\BusinessException ;
/**
* 车辆信息
*/
class VehicleController extends Crud
{
/**
* 不需要登录的方法
* @var string[]
*/
protected $noNeedLogin = [ 'detail' ];
/**
* 不需要鉴权的方法
* @var string[]
*/
2025-05-13 15:29:30 +08:00
protected $noNeedAuth = [ 'detail' , 'status' ];
2025-04-30 11:30:08 +08:00
2025-05-13 15:29:30 +08:00
protected $status = [
'zh-cn' => [ '未知' , '待发车' , '在途(发往fbo港口)' , '抵达发货港口' , '在途(发往目的地仓库)' , '抵达目的地' , '售出' ],
// 'zh' => ['未知','待发车','在途(发往fbo港口)','抵达发货港口','在途(发往目的地仓库)','抵达目的地','售出'],
'en' => [ 'unknown' , 'Awaiting departure' , 'In transit (to FBO port)' , 'Arriving at the port of shipment' , 'In transit (to destination warehouse)' , 'Arriving at the destination' , 'Sold' ],
'ru' => [ 'Неизвестно' , 'Ожидание отправления' , 'В пути (в порт FBO)' , 'Прибытие в порт отправления' , 'В пути (отправлено на склад назначения)' , 'Прибытие в пункт назначения' , 'Продано' ],
'ar' => [ 'غير معروف' , 'في انتظار سيارة' , 'على الطريق ( ميناء FBO )' , 'الوصول إلى ميناء الشحن' , 'في الطريق ( مستودع الوجهة )' , 'الوصول إلى الوجهة' , 'بيع' ],
];
2025-04-30 11:30:08 +08:00
/**
* @var Vehicle
*/
protected $model = null ;
/**
* 构造函数
* @return void
*/
public function __construct ()
{
$this -> model = new Vehicle ;
}
2025-05-13 15:29:30 +08:00
public function status ()
{
$lang = session ( 'lang' , 'zh-cn' );
$status = $this -> status [ $lang ];
return json ([ 'code' => 0 , 'msg' => 'success' , 'data' => $status ]);
}
2025-04-30 11:30:08 +08:00
/**
* 浏览
* @return Response
*/
public function index () : Response
{
2025-05-06 17:16:37 +08:00
$lang = session ( 'lang' , 'zh-cn' );
$translations = ( array ) require __DIR__ . '/../lang/' . $lang . '/vehicle.php' ;
$common = ( array ) require __DIR__ . '/../lang/' . $lang . '/common.php' ;
2025-05-06 20:21:09 +08:00
$translations = array_merge ( $common , $translations ); // 确保 common.php 的翻译优先
2025-05-06 17:16:37 +08:00
2025-05-06 20:21:09 +08:00
// 添加默认翻译,确保所有语言都有基本翻译
$required_translations = [
'title' => $lang === 'zh-cn' ? '车辆管理' : 'Vehicle Management' , // 确保title翻译存在
'brand' => $lang === 'zh-cn' ? '车辆品牌' : 'Vehicle Brand' ,
'brand_placeholder' => $lang === 'zh-cn' ? '请输入车辆品牌' : 'Please enter vehicle brand' ,
'model' => $lang === 'zh-cn' ? '车辆型号' : 'Vehicle Model' ,
'model_placeholder' => $lang === 'zh-cn' ? '请输入车辆型号' : 'Please enter vehicle model' ,
'vin' => 'VIN' ,
'vin_placeholder' => $lang === 'zh-cn' ? '请输入车架号' : 'Please enter VIN' ,
'status' => $lang === 'zh-cn' ? '车辆状态' : 'Status' ,
'status_placeholder' => $lang === 'zh-cn' ? '请选择状态' : 'Please select status' ,
'purchase_location' => $lang === 'zh-cn' ? '买车地点' : 'Purchase Location' ,
'purchase_location_placeholder' => $lang === 'zh-cn' ? '请输入买车地点' : 'Please enter purchase location' ,
'procedure_location' => $lang === 'zh-cn' ? '手续办理地' : 'Procedure Location' ,
'procedure_location_placeholder' => $lang === 'zh-cn' ? '请输入手续办理地' : 'Please enter procedure location' ,
'fbo_location' => 'FBO Location' ,
'fbo_location_placeholder' => $lang === 'zh-cn' ? '请选择FBO目的地' : 'Please select FBO location' ,
'current_location' => $lang === 'zh-cn' ? '车辆所在地' : 'Current Location' ,
'current_location_placeholder' => $lang === 'zh-cn' ? '请选择车辆所在地' : 'Please select current location' ,
'final_location' => $lang === 'zh-cn' ? '最终目的地' : 'Final Location' ,
'final_location_placeholder' => $lang === 'zh-cn' ? '请选择最终目的地' : 'Please select final location' ,
'departure_time' => $lang === 'zh-cn' ? 'FBO发车时间' : 'FBO Departure Time' ,
'departure_time_placeholder' => $lang === 'zh-cn' ? '请选择发车时间' : 'Please select departure time' ,
'arrival_time' => $lang === 'zh-cn' ? 'FBO到达时间' : 'FBO Arrival Time' ,
'arrival_time_placeholder' => $lang === 'zh-cn' ? '请选择到达时间' : 'Please select arrival time' ,
'shipping_cycle' => $lang === 'zh-cn' ? '运输周期' : 'Shipping Cycle' ,
'shipping_cycle_placeholder' => $lang === 'zh-cn' ? '请输入运输周期' : 'Please enter shipping cycle' ,
'img_url' => $lang === 'zh-cn' ? '图片' : 'Image' ,
'img_url_placeholder' => $lang === 'zh-cn' ? '请输入图片URL' : 'Please enter image URL' ,
'operation' => $lang === 'zh-cn' ? '操作' : 'Operation' ,
'refresh' => $lang === 'zh-cn' ? '刷新' : 'Refresh' ,
'filter' => $lang === 'zh-cn' ? '筛选' : 'Filter' ,
'print' => $lang === 'zh-cn' ? '打印' : 'Print' ,
'export' => $lang === 'zh-cn' ? '导出' : 'Export' ,
'id' => 'ID' ,
'created_at' => $lang === 'zh-cn' ? '创建时间' : 'Created At' ,
'updated_at' => $lang === 'zh-cn' ? '更新时间' : 'Updated At'
];
// 合并翻译,确保语言文件中的翻译优先
$translations = array_merge ( $required_translations , $translations );
2025-05-07 14:19:47 +08:00
2025-05-06 18:20:49 +08:00
2025-05-06 17:16:37 +08:00
return view ( 'vehicle/index' , [
'lang' => $lang ,
2025-05-06 20:21:09 +08:00
'translations' => $translations
2025-05-06 17:16:37 +08:00
]);
2025-04-30 11:30:08 +08:00
}
/**
* 插入
* @param Request $request
* @return Response
* @throws BusinessException
*/
public function insert ( Request $request ) : Response
{
2025-05-06 17:16:37 +08:00
$lang = session ( 'lang' , 'zh-cn' );
$translations = ( array ) require __DIR__ . '/../lang/' . $lang . '/vehicle.php' ;
$common = ( array ) require __DIR__ . '/../lang/' . $lang . '/common.php' ;
$translations = array_merge ( $translations , $common );
2025-05-06 18:20:49 +08:00
// 只在中文时使用默认翻译
if ( $lang === 'zh-cn' ) {
$required_translations = [
'brand' => '车辆品牌' ,
'brand_placeholder' => '请输入车辆品牌' ,
'model' => '车辆型号' ,
'model_placeholder' => '请输入车辆型号' ,
'vin' => '车架号' ,
'vin_placeholder' => '请输入车架号' ,
'status' => '车辆状态' ,
'status_placeholder' => '请选择状态' ,
'purchase_location' => '买车地点' ,
'purchase_location_placeholder' => '请输入买车地点' ,
'procedure_location' => '手续办理地' ,
'procedure_location_placeholder' => '请输入手续办理地' ,
'fbo_location' => 'FBO目的地' ,
'fbo_location_placeholder' => '请选择FBO目的地' ,
'current_location' => '车辆所在地' ,
'current_location_placeholder' => '请选择车辆所在地' ,
'final_location' => '最终目的地' ,
'final_location_placeholder' => '请选择最终目的地' ,
'departure_time' => 'FBO发车时间' ,
'departure_time_placeholder' => '请选择发车时间' ,
'arrival_time' => 'FBO到达时间' ,
'arrival_time_placeholder' => '请选择到达时间' ,
'shipping_cycle' => '运输周期' ,
'shipping_cycle_placeholder' => '请输入运输周期' ,
'img_url' => '图片' ,
'img_url_placeholder' => '请输入图片URL'
];
$translations = array_merge ( $required_translations , $translations );
}
2025-05-09 16:04:16 +08:00
// 如果是 POST 请求,处理数据保存和翻译
if ( $request -> method () === 'POST' ) {
2025-05-13 15:29:30 +08:00
$this -> save ( $request );
}
2025-05-09 16:04:16 +08:00
2025-05-13 15:29:30 +08:00
return view ( 'vehicle/insert' , [
'lang' => $lang ,
'translations' => $translations
]);
}
2025-05-09 16:04:16 +08:00
2025-05-13 15:29:30 +08:00
/**
* 保存
*/
public function save ( Request $request )
{
// 获取表单数据
$data = $request -> all ();
$data [ 'shipping_cycle' ] = ! empty ( $data [ 'shipping_cycle' ]) ? $data [ 'shipping_cycle' ] : 0 ;
2025-05-13 15:29:56 +08:00
$lang = session ( 'lang' , 'zh-cn' );
list ( $vehicleModel , $local ) = $this -> getModel ( $lang );
2025-05-13 15:29:30 +08:00
// 保存主表数据
if ( ! empty ( $data [ 'id' ])){
2025-05-13 15:29:56 +08:00
$vehicle = $vehicleModel :: find ( $data [ 'id' ]);
2025-05-13 15:29:30 +08:00
} else {
2025-05-13 15:29:56 +08:00
$vehicle = $vehicleModel ;
2025-05-13 15:29:30 +08:00
}
$vehicle -> fill ( $data );
$vehicle -> save ();
2025-05-09 16:04:16 +08:00
2025-05-13 15:29:30 +08:00
// 处理多语言翻译
2025-05-13 15:29:56 +08:00
$languages = [ 'zh-cn' => 'cn' , 'en' => 'en' , 'ar' => 'ar' , 'ru' => 'ru' ];
2025-05-13 15:29:30 +08:00
$translationModels = [
2025-05-13 15:29:56 +08:00
'cn' => Vehicle :: class ,
2025-05-13 15:29:30 +08:00
'en' => VehicleEn :: class ,
'ar' => VehicleAr :: class ,
'ru' => VehicleRu :: class
];
2025-05-13 15:29:56 +08:00
//删除已保存的模型
unset ( $translationModels [ $lang ]);
unset ( $languages [ $lang ]);
2025-05-09 16:04:16 +08:00
2025-05-13 15:29:30 +08:00
// 创建翻译服务实例
$translatorService = new \app\service\TranslatorService ();
2025-05-13 15:29:56 +08:00
foreach ( $languages as $language ) {
$translationModel = $translationModels [ $language ];
2025-05-13 15:29:30 +08:00
if ( ! empty ( $data [ 'id' ])){
// $vehicle = Vehicle::find($data['id']);
$translation = $translationModel :: find ( $data [ 'id' ]);
} else {
2025-05-09 16:04:16 +08:00
$translation = new $translationModel ();
2025-05-13 15:29:30 +08:00
}
2025-05-09 16:04:16 +08:00
2025-05-13 15:29:30 +08:00
// 复制主表数据
$translation -> fill ( $data );
$translation -> id = $vehicle -> id ;
2025-05-09 16:04:16 +08:00
2025-05-13 15:29:30 +08:00
// 使用翻译服务处理需要翻译的字段
2025-05-13 15:29:56 +08:00
log :: info ( 'lang:' ,[ $language , $lang ]);
$translatedData = $translatorService -> vehicle ( $data , $language , $lang );
2025-05-09 16:04:16 +08:00
2025-05-13 15:29:30 +08:00
// 更新翻译后的字段
$translation -> brand = $translatedData [ 'brand' ] ?? $data [ 'brand' ];
$translation -> model = $translatedData [ 'model' ] ?? $data [ 'model' ];
// $translation->status = $translatedData['status'] ?? $data['status'];
$translation -> purchase_location = $translatedData [ 'purchase_location' ] ?? $data [ 'purchase_location' ];
$translation -> procedure_location = $translatedData [ 'procedure_location' ] ?? $data [ 'procedure_location' ];
2025-05-09 16:04:16 +08:00
// $translation->fbo_destination = $translatedData['fbo_destination'] ?? $data['fbo_destination'];
2025-05-13 15:29:30 +08:00
$translation -> save ();
2025-05-09 16:04:16 +08:00
}
2025-04-30 11:30:08 +08:00
}
2025-05-13 15:29:30 +08:00
2025-04-30 11:30:08 +08:00
/**
* 更新
* @param Request $request
* @return Response
* @throws BusinessException
*/
public function update ( Request $request ) : Response
{
2025-05-06 17:16:37 +08:00
$id = $request -> input ( 'id' );
$lang = session ( 'lang' , 'zh-cn' );
$translations = ( array ) require __DIR__ . '/../lang/' . $lang . '/vehicle.php' ;
$common = ( array ) require __DIR__ . '/../lang/' . $lang . '/common.php' ;
$translations = array_merge ( $translations , $common );
2025-05-06 18:20:49 +08:00
// 只在中文时使用默认翻译
if ( $lang === 'zh-cn' ) {
$required_translations = [
'brand' => '车辆品牌' ,
'brand_placeholder' => '请输入车辆品牌' ,
'model' => '车辆型号' ,
'model_placeholder' => '请输入车辆型号' ,
'vin' => '车架号' ,
'vin_placeholder' => '请输入车架号' ,
'status' => '车辆状态' ,
'status_placeholder' => '请选择状态' ,
'purchase_location' => '买车地点' ,
'purchase_location_placeholder' => '请输入买车地点' ,
'procedure_location' => '手续办理地' ,
'procedure_location_placeholder' => '请输入手续办理地' ,
'fbo_location' => 'FBO目的地' ,
'fbo_location_placeholder' => '请选择FBO目的地' ,
'current_location' => '车辆所在地' ,
'current_location_placeholder' => '请选择车辆所在地' ,
'final_location' => '最终目的地' ,
'final_location_placeholder' => '请选择最终目的地' ,
'departure_time' => 'FBO发车时间' ,
'departure_time_placeholder' => '请选择发车时间' ,
'arrival_time' => 'FBO到达时间' ,
'arrival_time_placeholder' => '请选择到达时间' ,
'shipping_cycle' => '运输周期' ,
'shipping_cycle_placeholder' => '请输入运输周期' ,
'img_url' => '图片' ,
'img_url_placeholder' => '请输入图片URL'
];
$translations = array_merge ( $required_translations , $translations );
}
2025-05-13 15:29:30 +08:00
// 如果是 POST 请求,处理数据保存和翻译
if ( $request -> method () === 'POST' ) {
$this -> save ( $request );
}
2025-05-06 18:20:49 +08:00
2025-05-06 17:16:37 +08:00
$data = Vehicle :: where ( 'id' , $id ) -> first ();
if ( ! $data ) {
return json ([ 'code' => 1 , 'msg' => $translations [ 'data_not_found' ] ?? '数据不存在' ]);
2025-04-30 11:30:08 +08:00
}
2025-05-06 17:16:37 +08:00
return view ( 'vehicle/update' , [
'id' => $id ,
'data' => $data ,
'lang' => $lang ,
'translations' => $translations
]);
2025-04-30 11:30:08 +08:00
}
/**
* 详情
* @param Request $request
* @return Response
* @throws BusinessException
*/
public function detail ( Request $request ) : Response
{
2025-05-06 17:16:37 +08:00
$id = $request -> input ( 'id' );
$lang = session ( 'lang' , 'zh-cn' );
$translations = ( array ) require __DIR__ . '/../lang/' . $lang . '/vehicle.php' ;
$common = ( array ) require __DIR__ . '/../lang/' . $lang . '/common.php' ;
$translations = array_merge ( $translations , $common );
2025-05-06 18:20:49 +08:00
// 只在中文时使用默认翻译
if ( $lang === 'zh-cn' ) {
$required_translations = [
'brand' => '车辆品牌' ,
'brand_placeholder' => '请输入车辆品牌' ,
'model' => '车辆型号' ,
'model_placeholder' => '请输入车辆型号' ,
'vin' => '车架号' ,
'vin_placeholder' => '请输入车架号' ,
'status' => '车辆状态' ,
'status_placeholder' => '请选择状态' ,
'purchase_location' => '买车地点' ,
'purchase_location_placeholder' => '请输入买车地点' ,
'procedure_location' => '手续办理地' ,
'procedure_location_placeholder' => '请输入手续办理地' ,
'fbo_location' => 'FBO目的地' ,
'fbo_location_placeholder' => '请选择FBO目的地' ,
'current_location' => '车辆所在地' ,
'current_location_placeholder' => '请选择车辆所在地' ,
'final_location' => '最终目的地' ,
'final_location_placeholder' => '请选择最终目的地' ,
'departure_time' => 'FBO发车时间' ,
'departure_time_placeholder' => '请选择发车时间' ,
'arrival_time' => 'FBO到达时间' ,
'arrival_time_placeholder' => '请选择到达时间' ,
'shipping_cycle' => '运输周期' ,
'shipping_cycle_placeholder' => '请输入运输周期' ,
'img_url' => '图片' ,
'img_url_placeholder' => '请输入图片URL'
];
$translations = array_merge ( $required_translations , $translations );
}
2025-05-06 17:16:37 +08:00
$data = Vehicle :: where ( 'id' , $id ) -> first ();
if ( ! $data ) {
return json ([ 'code' => 1 , 'msg' => $translations [ 'data_not_found' ] ?? '数据不存在' ]);
}
return view ( 'vehicle/detail' , [
'data' => $data ,
'lang' => $lang ,
'translations' => $translations
]);
2025-04-30 11:30:08 +08:00
}
/**
* 查询后置处理,添加位置信息
* @param mixed $items
* @return mixed
*/
protected function afterQuery ( $items )
{
2025-05-13 15:29:30 +08:00
$lang = session ( 'lang' , 'zh-cn' );
switch ( $lang ) {
case 'zh-cn' :
$vehicle = new \app\model\Vehicle ();
$hz = new \app\model\Location ();
break ;
case 'en' :
$vehicle = new \app\model\VehicleEn ();
$hz = new \app\model\LocationEn ();
break ;
case 'ru' :
$vehicle = new \app\model\VehicleRu ();
$hz = new \app\model\LocationRu ();
break ;
case 'ar' :
$vehicle = new \app\model\VehicleAr ();
$hz = new \app\model\LocationAr ();
break ;
}
2025-04-30 11:30:08 +08:00
foreach ( $items as & $item ) {
2025-05-13 15:29:30 +08:00
$item = $vehicle :: find ( $item [ 'id' ]);
$location = $hz :: find ( $item -> locations_id );
$item [ 'status_txt' ] = $this -> status [ $lang ][ $item -> status ] ?? $this -> status [ $lang ][ 0 ];
2025-05-07 14:19:47 +08:00
// $item->status = "已到达迪拜仓库";
2025-04-30 11:30:08 +08:00
$item -> location_name = $location ? $location -> name : '' ;
2025-05-13 15:29:30 +08:00
$final_location = $hz :: find ( $item -> final_locations_id );
2025-05-13 15:29:56 +08:00
// log::info('final_location_name:',[$item->final_locations_id]);
2025-04-30 11:30:08 +08:00
$item -> final_location_name = $final_location ? $final_location -> name : '' ;
2025-05-13 15:29:30 +08:00
$fbo_location = $hz :: find ( $item -> fbo_locations_id );
2025-04-30 11:30:08 +08:00
$item -> fbo_location_name = $fbo_location ? $fbo_location -> name : '' ;
2025-04-30 14:00:54 +08:00
2025-05-07 14:19:47 +08:00
$location = $hz :: find ( $item -> locations_id );
$item -> location_name = $location ? $location -> name : '' ;
2025-05-13 15:29:30 +08:00
// $car = $vehicle::find($item->id);
// $item->status = $car ? $car->status : $item->status;
2025-05-13 15:29:56 +08:00
// $location = $hz::find($item->final_location_id);
// $item->final_location_name = $location ? $location->name : '';
2025-05-07 14:19:47 +08:00
$location = $hz :: find ( $item -> fbo_locations_id );
$item -> fbo_location_name = $location ? $location -> name : '' ;
2025-04-30 14:58:01 +08:00
if ( ! str_starts_with ( $item [ 'img_url' ], 'http' )){
try {
$ossservice = new OssService ();
2025-04-30 15:32:58 +08:00
$img_url = $ossservice -> generatePrivateUrl ( $item [ 'img_url' ]);
2025-05-06 22:03:34 +08:00
// $ossservice = new OssService();
// $oss_picture = $ossservice->generatePrivateUrl($follow['picture'],86400);
2025-04-30 14:58:01 +08:00
Log :: info ( "Vehicle image URL generation:" , [
'original_url' => $item [ 'img_url' ],
2025-04-30 15:06:32 +08:00
'generated_url' => $img_url ,
'current_time' => time ()
2025-04-30 14:58:01 +08:00
]);
$item [ 'img_url' ] = $img_url ;
} catch ( \Exception $e ) {
Log :: error ( "Vehicle image URL generation failed:" , [
'error' => $e -> getMessage (),
2025-04-30 15:06:32 +08:00
'original_url' => $item [ 'img_url' ],
'error_code' => $e -> getCode (),
'trace' => $e -> getTraceAsString ()
2025-04-30 14:58:01 +08:00
]);
}
2025-04-30 14:09:13 +08:00
}
2025-04-30 14:00:54 +08:00
}
2025-04-30 14:09:13 +08:00
2025-04-30 11:30:08 +08:00
return $items ;
}
2025-05-06 20:21:09 +08:00
2025-05-13 15:29:56 +08:00
2025-05-06 20:21:09 +08:00
/**
2025-05-13 15:29:56 +08:00
* @param $lang
* @return array
*/
protected function getModel ( $lang ){
switch ( $lang ) {
case 'en' :
$vehicle = new \app\model\VehicleEn ();
$hz = new \app\model\LocationEn ();
break ;
case 'ru' :
$vehicle = new \app\model\VehicleRu ();
$hz = new \app\model\LocationRu ();
break ;
case 'ar' :
$vehicle = new \app\model\VehicleAr ();
$hz = new \app\model\LocationAr ();
break ;
default :
$vehicle = new \app\model\Vehicle ();
$hz = new \app\model\Location ();
break ;
}
return array ( $vehicle , $hz );
}
/**
2025-05-06 20:21:09 +08:00
* 获取翻译
* @param Request $request
* @return Response
*/
public function getTranslations ( Request $request ) : Response
{
$lang = session ( 'lang' , 'zh-cn' );
$translations = ( array ) require __DIR__ . '/../lang/' . $lang . '/vehicle.php' ;
$common = ( array ) require __DIR__ . '/../lang/' . $lang . '/common.php' ;
$translations = array_merge ( $translations , $common );
return json ([ 'code' => 0 , 'msg' => 'success' , 'data' => $translations ]);
}
2025-04-30 11:30:08 +08:00
}