model = ImageModel::class; $this->selectField = ['id', 'catalogue_id', 'url', 'type', 'status', 'created_at', 'updated_at']; $this->queryField = ['catalogue_id' => '=', 'type' => '=', 'status' => '=']; $this->orderBy = ['name' => 'id', 'sort' => 'asc']; $this->media = MediaUrlService::getInstance(); } /** * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ public function list(): array { $result = $this->getPageList(); $this->media->publicEach($result['items'], ['url']); return $result; } public function option(): mixed { $this->optionField = ['id', 'url as name']; return $this->getOption(); } /** * @throws Exception */ public function detail($id): mixed { $info = $this->getDetail($id); $info->url = $this->media->toPublic($info->url); return $info; } /** * 渲染图列表(老接口 image/get-render-graph,入参是 catalogue_id) */ public function renderGraph(int $catalogueId): array { return $this->listByCatalogue($catalogueId, ImageModel::TYPE_RENDER); } /** * 实物图列表(老接口 image/get-physical-drawing,入参是 catalogue_id) */ public function physicalDrawing(int $catalogueId): array { return $this->listByCatalogue($catalogueId, ImageModel::TYPE_PHYSICAL); } /** * 新增:前端图片组件一次能选多张,url 传数组时逐张入库 * @throws Exception */ public function create($params): mixed { $catalogueId = (int) ($params['catalogue_id'] ?? 0); if (!CatalogueModel::where('id', $catalogueId)->where('deleted_at', 0)->exists()) { $this->utils->errorThrow('商品不存在'); } $type = (int) ($params['type'] ?? ImageModel::TYPE_RENDER); $urls = $params['url'] ?? ''; $urls = is_array($urls) ? $urls : [$urls]; $now = time(); $rows = []; foreach ($urls as $url) { $url = $this->media->toStorage(is_string($url) ? $url : ''); if ($url === '') { continue; } $rows[] = [ 'catalogue_id' => $catalogueId, 'url' => $url, 'type' => $type, 'created_at' => $now, ]; } if (empty($rows)) { $this->utils->errorThrow('请上传图片'); } if (count($rows) === 1) { return $this->insert($rows[0]); } return ImageModel::insert($rows); } /** * @throws Exception */ public function update($id, $params): mixed { if (array_key_exists('url', $params)) { $params['url'] = $this->media->firstOf($params['url']); } return $this->save($id, $params); } /** * @throws Exception */ public function delete($id): mixed { return $this->del(is_array($id) ? $id : [$id]); } /** * @throws Exception */ public function status($id, $status): mixed { return $this->save($id, ['status' => (int) $status]); } private function listByCatalogue(int $catalogueId, int $type): array { if ($catalogueId <= 0) { return []; } $rows = ImageModel::where('catalogue_id', $catalogueId) ->where('type', $type) ->where('deleted_at', 0) ->orderBy('id') ->get(['id', 'catalogue_id', 'url', 'type', 'status']) ->toArray(); $this->media->publicEach($rows, ['url']); return $rows; } }