function ($params) { $keyword = $params['keyword'] ?? ''; return [ 'filters' => [ // ['field' => '***', 'operator' => '=', 'value' => '***'] ], 'fields' => ['id', 'vin', 'brand', 'cover', 'price', 'type', 'energy', 'model', 'video', 'views', 'created_at', 'updated_at'], 'relations' => [ 'translation' => ['vehicle_id', 'locale', 'name', 'condition_desc', 'location'], 'asked' => ['id', 'vehicle_id', 'status', 'sort'], 'asked.translation' => ['id', 'asked_id', 'locale', 'title', 'content'], 'trait' => ['id', 'vehicle_id', 'status', 'sort'], 'trait.translation' => ['id', 'trait_id', 'locale', 'title', 'content'], 'album' => ['id', 'vehicle_id', 'pic', 'status', 'sort'], 'album.translation' => ['id', 'album_id', 'locale', 'alt'], 'content' => ['id', 'vehicle_id', 'status', 'sort'], 'content.translation' => ['id', 'content_id', 'locale', 'content'], ], 'sorts' => [ ['field' => 'id', 'direction' => 'desc'] ], 'pagination' => [ 'page' => $params['page'] ?? 1, 'per_page' => $params['per_page'] ?? 10, ] ]; }, 'show' => function ($params) { $keyword = $params['keyword'] ?? ''; return [ 'filters' => [ // ['field' => '***', 'operator' => '=', 'value' => '***'] ], 'fields' => ['id', 'vin', 'brand', 'cover', 'price', 'type', 'energy', 'model', 'video', 'views', 'created_at', 'updated_at'], 'relations' => [ 'translation' => ['vehicle_id', 'locale', 'name', 'condition_desc', 'location'], 'asked' => ['id', 'vehicle_id', 'status', 'sort'], 'asked.translation' => ['id', 'asked_id', 'locale', 'title', 'content'], 'trait' => ['id', 'vehicle_id', 'status', 'sort'], 'trait.translation' => ['id', 'trait_id', 'locale', 'title', 'content'], 'album' => ['id', 'vehicle_id', 'pic', 'status', 'sort'], 'album.translation' => ['id', 'album_id', 'locale', 'alt'], 'content' => ['id', 'vehicle_id', 'status', 'sort'], 'content.translation' => ['id', 'content_id', 'locale', 'content'], ], 'sorts' => [ ['field' => 'id', 'direction' => 'desc'] ], 'pagination' => [ 'page' => $params['page'] ?? 1, 'per_page' => $params['per_page'] ?? 10, ] ]; } ]; } // 声明需要多语言翻译 protected array $translatable = [ 'condition_desc','name', ]; public function add(array $params) { $sourceLocale = locale(); $sourceFields = $this->extractSourceFields($params); if (empty($sourceFields)) { throw new \InvalidArgumentException("请传递至少一条 {$sourceLocale} 语言的翻译字段"); }; $askeds = $params['asked']; unset($params['asked']); $traits = $params['trait']; unset($params['trait']); $albums = $params['album']; unset($params['album']); $contents = $params['content']; unset($params['content']); $VehicleNewAskedService = new VehicleNewAskedService(new VehicleNewAskedModel()); $VehicleNewTraitService = new VehicleNewTraitService(new VehicleNewTraitModel()); $VehicleNewAlbumService = new VehicleNewAlbumService(new VehicleNewAlbumModel()); $VehicleNewContentService = new VehicleNewContentService(new VehicleNewContentModel()); Db::beginTransaction(); try { $info = $this->create($params); if (!$info) { throw new BusinessException('提交失败'); } // 异步翻译并写入 hs_vehicle_data_translation 表 (new TranslationService())->queueTranslations( 'vehicleNew', $info->id, $sourceLocale, $sourceFields ); foreach ($askeds as $asked) { $askedsourceFields = $VehicleNewAskedService->extractSourceFields($asked); $asked['vehicle_id'] = $info->id; $asked_res = $VehicleNewAskedService->create($asked); if (!$asked_res) { throw new BusinessException('提交失败'); } // $askedsourceFields['asked_id'] = $asked_res->id; (new TranslationService())->queueTranslations( 'vehicleNewAsked', $asked_res->id, $sourceLocale, $askedsourceFields ); } foreach ($traits as $trait) { $traitsourceFields = $VehicleNewTraitService->extractSourceFields($trait); $trait['vehicle_id'] = $info->id; $trait_res = $VehicleNewTraitService->create($trait); if (!$trait_res) { throw new BusinessException('提交失败'); } (new TranslationService())->queueTranslations( 'vehicleNewTrait', $trait_res->id, $sourceLocale, $traitsourceFields ); } foreach ($albums as $album) { $albumsourceFields = $VehicleNewAlbumService->extractSourceFields($album); $album['vehicle_id'] = $info->id; $album_res = $VehicleNewAlbumService->create($album); if (!$trait_res) { throw new BusinessException('提交失败'); } (new TranslationService())->queueTranslations( 'vehicleNewAlbum', $album_res->id, $sourceLocale, $albumsourceFields ); } foreach ($contents as $content) { $contentsourceFields = $VehicleNewContentService->extractSourceFields($content); $content['vehicle_id'] = $info->id; $trait_res = $VehicleNewContentService->create($content); if (!$trait_res) { throw new BusinessException('提交失败'); } (new TranslationService())->queueTranslations( 'vehicleNewContent', $trait_res->id, $sourceLocale, $contentsourceFields ); } Db::commit(); return true; } catch (\Throwable $th) { Db::rollBack(); throw $th; } } public function edit(array $params, int $id) { $sourceLocale = locale(); $sourceFields = $this->extractSourceFields($params); if (empty($sourceFields)) { throw new \InvalidArgumentException("请传递至少一条 {$sourceLocale} 语言的翻译字段"); }; $album = []; $trans = []; $albums = VehicleNewAlbumModel::VEHICLE_New_ALBUM_FIELDS; foreach ($params as $ko => $vo) { if (in_array($ko, $albums)) { $album[$ko] = $vo ?? ''; } elseif (in_array($ko, VehicleNewModel::TRANS_FIELDS)) { $trans[$ko] = $vo ?? ''; }else{ $data[$ko] = $vo ?? ''; } } Db::beginTransaction(); try { $info = $this->update($id, $params); if (!$info) { throw new BusinessException('提交失败'); } // 异步翻译并写入 hs_vehicle_data_translation 表 (new TranslationService())->queueTranslations( 'vehicle', $id, $sourceLocale, $sourceFields ); if ($album) { // $album['vehicle_data_id'] = $info->id; $albumModel = new VehicleAlbumModel(); if (!$albumModel->updateOrCreate( ['vehicle_data_id' => $id], $album )) { throw new BusinessException('提交失败'); } } // $applyModel = new VehicleApplyModel(); // if (!$applyModel->create([ // 'vehicle_data_id' => $info->id, // 'desc' => '提交审核' // ])) { // throw new BusinessException('提交失败'); // } // if (isset($params['draft_id']) && $params['draft_id']) { // if (!DraftsModel::where('id', $params['draft_id'])->delete()) { // throw new BusinessException('草稿移除失败'); // } // } Db::commit(); return true; } catch (\Throwable $th) { Db::rollBack(); throw $th; } } }