vr-shopxo-plugin/shopxo/app/plugins/vr_ticket/api/Goods.php

301 lines
9.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
/**
* VR票务插件 - C端商品API控制器
*
* 路由: /api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=goods&pluginsaction=xxx
*
* @package vr_ticket\api
*/
namespace app\plugins\vr_ticket\api;
use app\plugins\vr_ticket\service\SeatMapService;
use app\service\GoodsService;
/**
* C端商品 API
*/
class Goods
{
private static function success($data = [], string $msg = 'success')
{
return [
'code' => 0,
'msg' => $msg,
'data' => $data,
];
}
private static function error(string $msg = '请求失败', int $code = -1)
{
return [
'code' => $code,
'msg' => $msg,
'data' => [],
];
}
/**
* 获取热门推荐商品
*
* GET /api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=goods&pluginsaction=recommend
*/
public function recommend()
{
try {
// 调用 ShopXO 商品服务获取热门商品
// VR票务插件的 category_id 需要在商品管理中设置
$params = [
'is_new' => 0,
'is_recommend' => 1,
'is_error' => 0,
'is_delete_time' => 0,
'start' => 0,
'num' => 10,
'order_by' => 'sales',
'sort' => 'desc',
];
$result = GoodsService::GoodsList($params);
$list = self::formatGoodsList($result);
return self::success([
'list' => $list,
'count' => count($list),
]);
} catch (\Exception $e) {
return self::error('获取推荐失败: ' . $e->getMessage());
}
}
/**
* 获取商品列表
*
* GET /api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=goods&pluginsaction=lists
* @param int city_id 城市ID筛选
* @param int page 页码
* @param int size 每页数量
*/
public function lists()
{
try {
$page = input('page', 1, 'intval');
$size = input('size', 10, 'intval');
$cityId = input('city_id', 0, 'intval');
if (empty($cityId)) {
$cityId = input('cityid', 0, 'intval');
}
$start = ($page - 1) * $size;
$params = [
'is_new' => 0,
'is_error' => 0,
'is_delete_time' => 0,
'start' => $start,
'num' => $size,
'order_by' => 'add_time',
'sort' => 'desc',
];
// 城市筛选如果有设置produce_region
if (!empty($cityId)) {
$params['produce_region'] = $cityId;
}
$result = GoodsService::GoodsList($params);
$list = self::formatGoodsList($result);
return self::success([
'list' => $list,
'count' => count($list),
'page' => $page,
'size' => $size,
]);
} catch (\Exception $e) {
return self::error('获取列表失败: ' . $e->getMessage());
}
}
/**
* 获取周边商品
*
* GET /api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=goods&pluginsaction=merchandise
*/
public function merchandise()
{
try {
$page = input('page', 1, 'intval');
$size = input('size', 20, 'intval');
$start = ($page - 1) * $size;
// 获取VR票务相关的周边商品非票务类型
$params = [
'is_new' => 0,
'is_error' => 0,
'is_delete_time' => 0,
'start' => $start,
'num' => $size,
'order_by' => 'sales',
'sort' => 'desc',
// 可以根据实际情况添加商品分类筛选
];
$result = GoodsService::GoodsList($params);
$list = self::formatGoodsList($result);
return self::success([
'list' => $list,
'count' => count($list),
]);
} catch (\Exception $e) {
return self::error('获取周边商品失败: ' . $e->getMessage());
}
}
/**
* 获取商品详情
*
* GET /api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=goods&pluginsaction=detail&id=X
*/
public function detail()
{
$goodsId = input('id', 0, 'intval');
if ($goodsId <= 0) {
return self::error('参数错误商品ID无效');
}
try {
$goods = GoodsService::GoodsDetail($goodsId);
if (empty($goods)) {
return self::error('商品不存在', -404);
}
return self::success([
'goods' => self::formatGoodsDetail($goods),
]);
} catch (\Exception $e) {
return self::error('获取详情失败: ' . $e->getMessage());
}
}
/**
* 搜索商品
*
* GET /api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=goods&pluginsaction=search&keyword=X
*/
public function search()
{
$keyword = input('keyword', '', 'trim');
$page = input('page', 1, 'intval');
$size = input('size', 10, 'intval');
if (empty($keyword)) {
return self::error('请输入搜索关键词');
}
try {
$start = ($page - 1) * $size;
$params = [
'is_new' => 0,
'is_error' => 0,
'is_delete_time' => 0,
'start' => $start,
'num' => $size,
'title_like' => $keyword,
'order_by' => 'sales',
'sort' => 'desc',
];
$result = GoodsService::GoodsList($params);
$list = self::formatGoodsList($result);
return self::success([
'list' => $list,
'count' => count($list),
'keyword' => $keyword,
]);
} catch (\Exception $e) {
return self::error('搜索失败: ' . $e->getMessage());
}
}
/**
* 获取座位图(含实时库存)
*
* GET /api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=goods&pluginsaction=seatmap&goods_id=118
*
* @return array { code, msg, data: { seatSpecMap, goods_spec_data } }
*/
public function seatmap()
{
$goodsId = input('goods_id', 0, 'intval');
if ($goodsId <= 0) {
return self::error('参数错误goods_id 无效');
}
try {
$data = SeatMapService::GetSeatMap($goodsId);
return self::success($data);
} catch (\Exception $e) {
return self::error('获取座位图失败: ' . $e->getMessage());
}
}
/**
* 格式化商品列表数据
*/
private static function formatGoodsList($result)
{
$list = [];
if (!empty($result)) {
foreach ($result as $goods) {
$list[] = [
'id' => $goods['id'],
'title' => $goods['title'],
'image' => $goods['image'],
'price' => $goods['price'],
'original_price' => $goods['original_price'] ?? $goods['price'],
'sales' => $goods['sales'] ?? 0,
'stock' => $goods['stock'] ?? 0,
'venue' => isset($goods['produce_venue']) ? $goods['produce_venue'] : '',
'date' => isset($goods['produce_date']) ? $goods['produce_date'] : '',
'add_time' => $goods['add_time'] ?? '',
];
}
}
return $list;
}
/**
* 格式化商品详情数据
*/
private static function formatGoodsDetail($goods)
{
return [
'id' => $goods['id'],
'title' => $goods['title'],
'image' => $goods['image'],
'images' => !empty($goods['images']) ? explode(',', $goods['images']) : [$goods['image']],
'price' => $goods['price'],
'original_price' => $goods['original_price'] ?? $goods['price'],
'sales' => $goods['sales'] ?? 0,
'stock' => $goods['stock'] ?? 0,
'content' => htmlspecialchars_decode($goods['content'] ?? ''),
'spec_type' => $goods['spec_type'] ?? 0,
'spec_value_id' => $goods['spec_value_id'] ?? '',
// 票务相关字段
'venue' => $goods['produce_venue'] ?? '',
'date' => $goods['produce_date'] ?? '',
'time' => $goods['produce_time'] ?? '',
'region' => $goods['produce_region'] ?? '',
'add_time' => $goods['add_time'] ?? '',
];
}
}