coupon-admin/app/controller/api/Spu.php

335 lines
9.5 KiB
PHP

<?php
namespace app\controller\api;
use app\controller\api\Base;
use app\exception\RepositoryException;
use app\model\AccountLevel;
use app\model\AccountRecord;
use app\model\AccountRole;
use app\model\Spu as SpuModel;
use app\model\Disease;
use app\model\SpuActivity;
use app\model\Staff;
use app\repository\OrderRepository;
use app\repository\SpuRepository;
use Exception;
use think\Collection;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\facade\Log;
use think\response\Json;
class Spu extends Base
{
protected $exceptExtra = ['list', 'category', 'detail'];
/**
* 商品列表筛选条件
*
* @throws ModelNotFoundException
* @throws DbException
* @throws DataNotFoundException
*/
public function condition(): Json
{
$list = [
'disease' => Disease::getListByPid(0, ['pid', 'name', 'id', 'sort']),
'doctor_roles' => AccountRole::findAccountRolesByGroupName(AccountRole::ROLE_GROUP_DOCTOR),
'activity' => SpuModel::activity(),
];
return $this->json(0, 'success', $list);
}
/**
* 获取已发布的商品列表
*
* @return Json
* @throws RepositoryException
* @throws Exception
*/
public function list(): Json
{
$repo = SpuRepository::getInstance();
$fields = SpuModel::spuListFields();
$params = input();
$params['fields'] = $fields;
$params['is_score'] = SpuModel::COMMON_OFF;//排除积分商品
$list = $repo->listForFront($params, function ($q) {
return $q->with([
'activity_info' => function ($query) {
$query->withoutField('content');
}
]);
});
return $this->json(0, 'success', $list);
}
/**
* 获取已发布的积分商品列表
*
* @return Json
* @throws RepositoryException
* @throws Exception
*/
public function score(): Json
{
$repo = SpuRepository::getInstance();
$type = input('type/s', SpuModel::TYPE_NORMAL);//normal=综合 newest=最新
$sortField = input('sort_field/s', '');// score=积分 num=兑换量
$sortValue = input('sort_value/s', '');//desc=降序 asc=升序
$rules = [
'page|页数' => 'integer|gt:0',
'size|每页数量' => 'integer|gt:0',
'type|类型' => 'in:newest,'.SpuModel::TYPE_NORMAL,
'sort_field|排序字段' => 'in:score,amount',
'sort_value|排序值' => 'in:asc,desc',
];
$message = [
'type.in' => '类型错误',
'$sortField.in' => '排序字段错误',
'sort_value.in' => '排序值错误',
];
$params = input();
$validate = $this->validateByApi($params, $rules, $message);
if ($validate !== true) {
return $validate;
}
$order = [];//排序
// 综合排序
if ($type === SpuModel::TYPE_NORMAL) {
$order = [
'sort' => 'desc',
'id' => 'desc',
];
}
// 最新排序
if ($type === 'newest') {
$order = ['published_at' => 'desc'];
}
// 兑换量排序
if (!empty($sortField)) {
if (empty($sortValue)) {
return $this->json(4003, '排序参数错误');
}
$order = [
$sortField => $sortValue
];
}
$params['is_score'] = SpuModel::COMMON_ON;
$params['fields'] = SpuModel::scoreListFields();
$list = $repo->listForFront($params, function ($q) {
return $q->with([
'activity_info' => function ($query) {
$query->withoutField('content');
}
]);
}, $order);
return $this->json(0, 'success', $list);
}
/**
* 收藏列表
*
* @return Json
* @throws Exception
*/
public function collection(): Json
{
$rules = [
'page|页数' => 'integer',
'size|每页数量' => 'integer',
];
$params = input();
$page = $params['page'] ?? 1;
$size = $params['size'] ?? 10;
$accountId = $this->request->user['user_id'] ?? 0;
$params['page'] = 1;
$params['size'] = 0;
$validate = $this->validateByApi($params, $rules);
if ($validate !== true) {
return $validate;
}
//获取收藏相关
$collection = AccountRecord::where('type', AccountRecord::TYPE_SPU)
->where('action', AccountRecord::ACTION_COLLECT)
->where('account_id', $accountId)
->where('is_record', AccountRecord::COMMON_ON)
->order('recorded_at', 'desc');
$total = $collection->count();
if ($total <= 0) {
return $this->json(0, 'success', [
'total' => 0,
'current' => $page,
'size' => $size,
'list' => new Collection(),
]);
}
$recordList = $collection->page($page)->limit($size)->field('relation_id,recorded_at')->select();
$where = [];
$where[] = ['id', 'in', $recordList->column('relation_id')];
$list = SpuRepository::getInstance()->listForFront($params, function ($q) {
return $q->with([
'activity_info' => function ($query) {
$query->withoutField('content');
}
]);
}, [], $where);
$data = [];
$spuList = $list['list']->toArray();
foreach ($recordList as $record) {
foreach ($spuList as $key => $spu) {
if ($record['relation_id'] == $spu['id']) {
$data[] = $spu;
unset($spuList[$key]);
}
}
}
$list['total'] = $total;
$list['current'] = $page;
$list['size'] = $size;
$list['list'] = $data;
return $this->json(0, 'success', $list);
}
/**
* SPU 详情
*/
public function detail(): Json
{
$repo = SpuRepository::getInstance();
$id = input('id/d', 0);
$shareId = input('share_id/d', 0);//分享人ID
$isActivity = input('is_activity/d', 0);//分享人ID
$accountId = $this->request->user['user_id'] ?? 0;
try {
$data = $repo->detail($id, $accountId, $shareId, (bool) $isActivity);
return $this->json(0, 'success', $data);
} catch (RepositoryException $e) {
return $this->json(4001, $e->getMessage());
} catch (Exception $e) {
$repo->log($e->getMessage(), $e);
return $this->json(5000, '获取详情失败');
}
}
/**
* 获取指定活动商品的拼团列表 仅限拼团活动商品
*/
public function groupList(): Json
{
$id = input('id/d', 0);
try {
$data = OrderRepository::getInstance()->getGroupList($id);
return $this->json(0, 'success', $data);
} catch (RepositoryException $e) {
return $this->json(4001, $e->getMessage());
} catch (Exception $e) {
SpuRepository::log($e->getMessage(), $e);
return $this->json(5000, '获取拼团列表失败');
}
}
/**
* 收藏
*/
public function record(): Json
{
if (!$this->request->isPost()) {
return $this->json(4000, '无效请求');
}
$accountId = $this->request->user['user_id'] ?? 0;
$id = $this->request->param('id/d', 0);
$action = $this->request->param('action/s', '');
try {
if ($accountId <= 0 || $id <= 0) {
return $this->json(4001, '无效请求');
}
if (!in_array($action, AccountRecord::allowActions())) {
return $this->json(4001, '操作类型参数错误');
}
if (!SpuModel::findById($id)) {
return $this->json(4001, '商品不存在');
}
AccountRecord::record($accountId, AccountRecord::TYPE_SPU, $action, $id);
} catch (Exception $e) {
Log::error('[商品记录失败]'.$e->getMessage());
return $this->json(5000, '操作失败');
}
return $this->json();
}
/**
* 取消 收藏
*/
public function unRecord(): Json
{
if (!$this->request->isPost()) {
return $this->json(4000, '无效请求');
}
$accountId = $this->request->user['user_id'] ?? 0;
$id = $this->request->param('id/d', 0);
$action = $this->request->param('action/s', '');
try {
if ($accountId <= 0 || $id <= 0) {
return $this->json(4001, '无效请求');
}
if (!in_array($action, AccountRecord::allowActions())) {
return $this->json(4001, '操作类型参数错误');
}
if (!SpuModel::findById($id)) {
return $this->json(4001, '商品不存在');
}
AccountRecord::unRecord($accountId, $id, AccountRecord::TYPE_SPU, $action);
} catch (Exception $e) {
Log::error('[取消商品记录失败]'.$e->getMessage());
return $this->json(5000, '操作失败');
}
return $this->json();
}
}