Files
car_info/app/controller/VehicleController.php
T
2025-06-09 13:48:04 +08:00

281 lines
12 KiB
PHP

<?php
namespace app\controller;
use app\model\LogisticsShip;
use app\model\LogisticsShipHis;
use app\model\Vehicle;
use app\model\VehicleEn;
use app\model\VehicleRu;
use app\model\VehicleAr;
use app\model\Location;
use app\model\LocationEn;
use app\model\LocationRu;
use app\model\LocationAr;
use app\service\OssService;
// use plugin\admin\app\model\Location;
use app\service\ShipService;
use app\service\TranslatorService;
use util\Util;
use support\Request;
use support\Cache;
class VehicleController
{
// protected $status = ['未知','待发车','在途(发往fbo港口)','抵达发货港口','在途(发往目的地仓库)','抵达目的地','售出'];
protected $status = [
'zh' => ['未知', '待发车', '在途(发往fbo港口)', '抵达发货港口', '在途(发往目的地仓库)', '抵达目的地', '售出', '待采购', '已付定金待提车'],
'en' => ['Unknown', 'Pending Departure', 'In Transit (to FBO Port)', 'Arrived at Shipping Port', 'In Transit (to Destination Warehouse)', 'Arrived at Destination', 'Sold', 'To be purchased', 'Deposit paid, waiting to be picked up'],
'ru' => ['Неизвестно', 'Ожидает отправки', 'В пути (к порту FBO)', 'Прибыл в порт отправки', 'В пути (к складу назначения)', 'Прибыл в пункт назначения', 'Продано', 'Ожидаемые закупки', 'Выплаченные авансы'],
'ar' => ['غير معروف', 'في انتظار الشحن', 'في الطريق (إلى ميناء FBO)', 'وصل إلى ميناء الشحن', 'في الطريق (إلى مستودع الوجهة)', 'وصل إلى الوجهة', 'تم البيع', 'في انتظار شراء', 'دفع عربون السيارة'],
];
/**
* Mask VIN number by showing only first 2 and last 6 characters
*/
private function maskVin($vin)
{
if (strlen($vin) <= 8) {
return $vin;
}
return substr($vin, 0, 2) . str_repeat('*', strlen($vin) - 8) . substr($vin, -6);
}
/**
* Get all vehicles with their locations
*/
public function index(Request $request)
{
$lang = $request->post('lang', 'zh');
$status = $request->post('status', '4');
// 接收请求参数(Webman自动注入)
$page = $request->post('page', 1); // 默认第1页
$pageSize = $request->post('pageSize', 30); // 默认每页30条
$where = [];
if($status == 1){
$status = [5,6];
}elseif ($status == 2){
$status = [4];
}elseif ($status == 3){
$status = [1,2,3,7,8];
$where[] = ['vin' ,'!=', null];
}elseif ($status == 4){
$status = [1,2,3,7,8];
$where[] = ['vin' ,'=', null];
}
switch ($lang) {
case 'zh':
$vehicles = Vehicle::with('location')->with('finalLocation')->where($where)->whereIn('status',$status)->offset(($page-1)*$pageSize) ->limit($pageSize)->get();
$hz = new Location();
break;
case 'en':
$vehicles = VehicleEn::with('location')->with('finalLocation')->where($where)->whereIn('status',$status)->offset(($page-1)*$pageSize) ->limit($pageSize)->get();
$hz = new LocationEn();
break;
case 'ru':
$vehicles = VehicleRu::with('location')->with('finalLocation')->where($where)->whereIn('status',$status)->offset(($page-1)*$pageSize) ->limit($pageSize)->get();
$hz = new LocationRu();
break;
case 'ar':
$vehicles = VehicleAr::with('location')->with('finalLocation')->where($where)->whereIn('status',$status)->offset(($page-1)*$pageSize) ->limit($pageSize)->get();
$hz = new LocationAr();
break;
}
// // $vehicles = Vehicle::with('location')->with('finalLocation')->get();
// $vehicles->each(function ($vehicle) use ($hz) {
// if (isset($vehicle->vin)) {
// $vehicle->vin = $this->maskVin($vehicle->vin);
// }
// // $vehicle->status = $this->status[$vehicle->status]??$this->status[0];
// // $location = Location::find($vehicle->locations_id);
// // $vehicle->location_name = $location ? $location->name : '';
// // $final_location = Location::find($vehicle->final_locations_id);
// // $vehicle->final_location_name = $final_location ? $final_location->name : '';
// $fbo_location = $hz->find($vehicle->fbo_locations_id);
// $vehicle->fbo_destination = $fbo_location ? $fbo_location->name : '';
// if(!str_starts_with($vehicle['img_url'], 'http')){
// $ossservice = new OssService();
// $img_url = $ossservice->generatePrivateUrl($vehicle['img_url'],86400);
// $vehicle['img_url'] = $img_url;
// }
// });
// =================================== new ===================================== start
// 单独处理 locations
$fboIds = $vehicles->pluck('fbo_locations_id')->toArray();
$fbo = $hz->whereIn('id', array_unique($fboIds))->get()->toArray();
$arr = [];
foreach ($fbo as $value) {
$arr[$value['id']] = $value;
}
$ossservice = null;
// 组装数据
foreach ($vehicles as &$vehicle) {
if (isset($vehicle->vin)) {
$vehicle->vin = $this->maskVin($vehicle->vin);
}
$vehicle->purchase_location='';
$vehicle->procedure_location='';
$vehicle->fbo_destination = isset($arr[$vehicle->fbo_locations_id]) ? $arr[$vehicle->fbo_locations_id]['name'] : '';
$vehicle->status_val = $vehicle->status;
if(is_numeric($vehicle->status)) {
$vehicle->status = $this->status[$lang][$vehicle->status]??$this->status[$lang][0];
}
// if(!empty($vehicle['img_url'])) {
// $img_url = Cache::get('img_dib_'.$vehicle->id);
// if ($img_url) {
// $vehicle['img_url'] = $img_url;
// } else {
// $ossservice = empty($ossservice)?new OssService():$ossservice;
// $img_url = $ossservice->generatePrivateUrl($vehicle['img_url'],86400);
// $vehicle['img_url'] = $img_url;
// Cache::set('img_dib_'.$vehicle->id, $img_url, 86390);
// }
// }else{
// $vehicle['img_url'] = '';
// }
if(!empty($vehicle['ship_id'])){
$vehicle['ship'] = LogisticsShip::find($vehicle['ship_id'])->toArray();
}
}
unset($vehicle);
// =================================== new ===================================== end
$count = Vehicle::where($where)->whereIn('status',$status)->count();
$result = ['list' => $vehicles,'count'=>$count];
return Util::success($result);
}
public function ship(Request $request){
// $res = ShipService::getShipInfo('636023678');
// return Util::success($res);
$lang = $request->post('lang', 'zh');
$id = $request->post('id');
if(empty($id)){
return Util::fail([],'id不能为空');
}
// 接收请求参数(Webman自动注入)
$page = $request->post('page', 1); // 默认第1页
$pageSize = $request->post('pageSize', 30); // 默认每页30条
// var_dump($id);die;
switch ($lang) {
case 'zh':
$vehicles = Vehicle::with('location')->with('finalLocation')->where(['ship_id' => $id])->offset(($page-1)*$pageSize) ->limit($pageSize)->get();
$hz = new Location();
break;
case 'en':
$vehicles = VehicleEn::with('location')->with('finalLocation')->where(['ship_id' => $id])->offset(($page-1)*$pageSize) ->limit($pageSize)->get();
$hz = new LocationEn();
break;
case 'ru':
$vehicles = VehicleRu::with('location')->with('finalLocation')->where(['ship_id' => $id])->offset(($page-1)*$pageSize) ->limit($pageSize)->get();
$hz = new LocationRu();
break;
case 'ar':
$vehicles = VehicleAr::with('location')->with('finalLocation')->where(['ship_id' => $id])->offset(($page-1)*$pageSize) ->limit($pageSize)->get();
$hz = new LocationAr();
break;
}
// 组装数据
foreach ($vehicles as &$vehicle) {
if (isset($vehicle->vin)) {
$vehicle->vin = $this->maskVin($vehicle->vin);
}
$vehicle->purchase_location='';
$vehicle->procedure_location='';
$vehicle->fbo_destination = isset($arr[$vehicle->fbo_locations_id]) ? $arr[$vehicle->fbo_locations_id]['name'] : '';
$vehicle->status_val = $vehicle->status;
if(is_numeric($vehicle->status)) {
$vehicle->status = $this->status[$lang][$vehicle->status]??$this->status[$lang][0];
}
if(!empty($vehicle['img_url'])) {
$img_url = Cache::get('img_dib_'.$vehicle->id);
if ($img_url) {
$vehicle['img_url'] = $img_url;
} else {
$ossservice = empty($ossservice)?new OssService():$ossservice;
$img_url = $ossservice->generatePrivateUrl($vehicle['img_url'],86400);
$vehicle['img_url'] = $img_url;
Cache::set('img_dib_'.$vehicle->id, $img_url, 86390);
}
}else{
$vehicle['img_url'] = '';
}
if(!empty($vehicle['ship_id'])){
$vehicle['ship'] = LogisticsShip::find($vehicle['ship_id'])->toArray();
}
}
unset($vehicle);
$logisticsShip = LogisticsShip::where(['id' => $id])->first();
$logisticsShipHis = LogisticsShipHis::where(['ship_id'=> $id])->get();
$count = Vehicle::where(['ship_id' => $id])->count();
$result = ['list' => $vehicles,'ship' => $logisticsShip,'ship_his' => $logisticsShipHis,'count'=>$count];
return Util::success($result);
}
/**
* Get a specific vehicle with its location
*/
public function show(Request $request, $id)
{
$lang = $request->post('lang', 'zh');
switch ($lang) {
case 'zh':
$vehicle = Vehicle::with('location')->find($id);
break;
case 'en':
$vehicle = VehicleEn::with('location')->find($id);
break;
case 'ru':
$vehicle = VehicleRu::with('location')->find($id);
break;
case 'ar':
$vehicle = VehicleAr::with('location')->find($id);
break;
}
// $vehicle = Vehicle::with('location')->find($id);
if (!$vehicle) {
return Util::fail($vehicle,'Vehicle not found');
}
if (isset($vehicle->vin)) {
$vehicle->vin = $this->maskVin($vehicle->vin);
}
return Util::success($vehicle);
}
public function unset(Request $request, $id){
$id = $request->get('id','');
if(!empty($id)){
Cache::delete('img_dib_'.$id);
}elseif($id == 'all'){
Cache::clear();
}
return Util::success();
}
}