where('status', 1) ->where('stock_status', 1) // 库存充足 ->order('sort', 'desc') ->order('id', 'desc') ->field('id, name, image, description, package_id') ->select() ->toArray(); // // 查询每个产品的套餐信息 // foreach ($products as &$product) { // // 获取产品对应的所有套餐规格 // $product['packages'] = $this->getProductPackages($product['id'], $product['package_id']); // // // 获取主图 // $product['main_image'] = $this->getMainImage($product['image']); // } $this->success('', $products); } /** * 获取产品对应的套餐 */ private function getProductPackages($productId, $packageId, $detail = false) { // 查询套餐规格 $query = Db::table('ba_package_price') ->alias('pp') ->leftJoin('ba_package p', 'p.id = pp.package_id') ->where('p.status', 1) ->where('pp.price', '>', 0); // 如果产品有关联的package_id,使用它 if ($packageId) { $query->where('pp.package_id', $packageId); } else { // 如果没有,可能需要其他关联逻辑 // 这里简化处理,返回空 return []; } // 如果是详情页,获取更多字段 if ($detail) { $packages = $query->field(' pp.id, pp.spec_name, pp.price, pp.type, pp.card_type, pp.unit_value, pp.points_value, pp.stock, pp.sold_count, pp.description, p.name as package_name ')->select()->toArray(); } else { // 列表页只需要基本信息 $packages = $query->field(' pp.id, pp.spec_name, pp.price, pp.type, pp.card_type, pp.unit_value, pp.points_value, pp.stock, pp.sold_count ')->select()->toArray(); } // 格式化数据 $formattedPackages = []; foreach ($packages as $package) { $formattedPackage = [ 'id' => $package['id'], 'name' => $package['spec_name'], 'type' => $package['type'], 'type_text' => $package['type'] == 1 ? '个人' : '企业', 'price' => floatval($package['price']), 'price_text' => '¥' . number_format($package['price'], 2), 'stock' => intval($package['stock']), 'stock_text' => $this->getStockText($package['stock']), 'sold_count' => intval($package['sold_count']), 'card_type' => $package['card_type'], 'card_info' => $this->getCardInfo($package['card_type'], $package['unit_value'], $package['points_value']) ]; // 如果是详情页,添加更多信息 if ($detail) { $formattedPackage['description'] = $package['description'] ?? '商品说明'; $formattedPackage['package_name'] = $package['package_name'] ?? ''; } $formattedPackages[] = $formattedPackage; } return $formattedPackages; } /** * 获取套餐列表 */ public function list(): void { // 获取参数(可根据产品筛选) $productId = $this->request->get('product_id', 0); // 构建查询 $query = Db::table('ba_package_price') ->alias('pp') ->leftJoin('ba_package p', 'p.id = pp.package_id') ->where('p.status', 1) ->where('pp.price', '>', 0) ->order('pp.type', 'asc') // 个人在前,企业在后 ->order('pp.price', 'asc'); // 价格从低到高 // 如果有产品ID,筛选对应的套餐 if ($productId > 0) { $product = Db::table('ba_product') ->where('id', $productId) ->field('package_id') ->find(); if ($product && $product['package_id']) { $query->where('pp.package_id', $product['package_id']); } } // 获取套餐数据 $packages = $query->field(' pp.id, pp.spec_name, pp.image, pp.price, pp.type, pp.card_type, pp.unit_value, pp.points_value, pp.stock, pp.sold_count, pp.description ')->select()->toArray(); // 格式化返回数据(严格按照截图格式) $formattedPackages = []; foreach ($packages as $package) { $formattedPackage = [ 'id' => $package['id'], 'name' => $package['spec_name'], // 套餐名称 'type' => $package['type'], // 1个人,2企业 'type_text' => $package['type'] == 1 ? '个人' : '企业', 'price' => floatval($package['price']), 'price_text' => '¥' . number_format($package['price'], 2), 'description' => $package['description'] ?? '商品说明', 'stock' => intval($package['stock']), 'stock_text' => $this->getStockText($package['stock']), 'sold_count' => intval($package['sold_count']), 'card_type' => $package['card_type'], 'image' => $package['image'], 'card_info' => $this->getCardInfo($package['card_type'], $package['unit_value'], $package['points_value']) ]; $formattedPackages[] = $formattedPackage; } $this->success('', $formattedPackages); } /** * 获取套餐详情(用于购买页面) */ public function detail(): void { $packageId = $this->request->get('id', 0); if ($packageId <= 0) { $this->error('套餐ID错误'); } // 查询套餐详情 $package = Db::table('ba_package_price') ->alias('pp') ->leftJoin('ba_package p', 'p.id = pp.package_id') ->where('pp.id', $packageId) ->field(' pp.id, pp.image, pp.spec_name, pp.price, pp.type, pp.card_type, pp.unit_value, pp.points_value, pp.stock, pp.sold_count, pp.description, p.name as package_name, p.description as package_description ') ->find(); if (!$package) { $this->error('套餐不存在'); } // 查询关联的产品信息 $product = Db::table('ba_product') ->where('package_id', $package['package_id'] ?? 0) ->field('id, name, image') ->find(); // 格式化详情数据 $formattedDetail = [ 'id' => $package['id'], 'name' => $package['spec_name'], 'type' => $package['type'], 'type_text' => $package['type'] == 1 ? '个人' : '企业', 'price' => floatval($package['price']), 'price_text' => '¥' . number_format($package['price'], 2), 'description' => $package['description'] ?? ($package['package_description'] ?? '商品说明'), 'stock' => intval($package['stock']), 'stock_text' => $this->getStockText($package['stock']), 'sold_count' => intval($package['sold_count']), 'card_type' => $package['card_type'], 'card_info' => $this->getCardInfo($package['card_type'], $package['unit_value'], $package['points_value']), 'package_name' => $package['package_name'], 'image' => $package['image'], 'product' => $product ? [ 'id' => $product['id'], 'name' => $product['name'], 'image' => $this->getMainImage($product['image']) ] : null ]; $this->success('', $formattedDetail); } /** * 获取库存状态文本 */ private function getStockText($stock): string { if ($stock <= 0) { return '售罄'; } elseif ($stock <= 10) { return '即将售罄'; } else { return '充足'; } } /** * 获取卡类型信息 */ private function getCardInfo($cardType, $unitValue, $pointsValue): array { $cardTypes = [ 1 => ['name' => '次卡', 'show_value' => $unitValue . '次'], 2 => ['name' => '积分卡', 'show_value' => $pointsValue . '积分'], 3 => ['name' => '日卡', 'show_value' => '1天'], 4 => ['name' => '周卡', 'show_value' => '7天'], 5 => ['name' => '季卡', 'show_value' => '90天'], 6 => ['name' => '月卡', 'show_value' => '30天'], 7 => ['name' => '年卡', 'show_value' => '365天'] ]; return $cardTypes[$cardType] ?? ['name' => '其他', 'show_value' => '']; } /** * 获取主图 */ private function getMainImage($imageJson) { if (empty($imageJson)) { return ''; } $images = json_decode($imageJson, true); if (is_array($images) && !empty($images)) { return $images[0]; } return ''; } }