| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- <?php
- namespace app\api\controller\product;
- use app\common\controller\Frontend;
- use think\facade\Db;
- class Package extends Frontend
- {
- protected array $noNeedPermission = ['product_list','list', 'detail'];
- protected array $noNeedLogin = ['*'];
- /**
- * 获取产品列表(简化版)
- */
- public function product_list(): void
- {
- // 查询所有上架的产品
- $products = Db::table('ba_product')
- ->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 '';
- }
- }
|