494 lines
15 KiB
PHP
494 lines
15 KiB
PHP
<?php
|
||
|
||
namespace app\controller\manager\mall;
|
||
|
||
use app\controller\manager\Base;
|
||
use app\exception\RepositoryException;
|
||
use app\model\Config;
|
||
use app\model\Log;
|
||
use app\model\Sku;
|
||
use app\model\Spu as SpuModel;
|
||
use app\model\SpuActivity;
|
||
use app\repository\SpuRepository;
|
||
use app\service\Math;
|
||
use Exception;
|
||
use think\db\exception\DataNotFoundException;
|
||
use think\db\exception\DbException;
|
||
use think\db\exception\ModelNotFoundException;
|
||
use think\exception\ValidateException;
|
||
use think\facade\Db;
|
||
use think\response\Json;
|
||
use think\response\View;
|
||
|
||
class Activity extends Base
|
||
{
|
||
protected $noNeedLogin = ['getOrder', 'getOrderGroupList'];
|
||
|
||
/**
|
||
* 列表
|
||
*
|
||
* @throws Exception
|
||
*/
|
||
public function index()
|
||
{
|
||
if ($this->request->isPost()) {
|
||
$params = input();
|
||
$params['type'] = SpuModel::TYPE_GROUP_BUY;
|
||
$params['type'] = SpuModel::TYPE_GROUP_BUY;
|
||
|
||
$res = $this->spuList($params);
|
||
|
||
return $this->json(0, 'success', $res);
|
||
}
|
||
|
||
$this->data['statusList'] = SpuModel::statusTextList();
|
||
$this->data['spuTypeList'] = SpuModel::spuTypeTextList();
|
||
$this->data['type'] = SpuModel::TYPE_GROUP_BUY;
|
||
|
||
$this->data['mpPath'] = Config::MINI_PATH_SPU_INFO;
|
||
|
||
return $this->view();
|
||
}
|
||
|
||
/**
|
||
* 拼团
|
||
*
|
||
* @return Json|View
|
||
*/
|
||
public function groupMake()
|
||
{
|
||
if ($this->request->isPost()) {
|
||
$params = input();
|
||
$params['type'] = SpuModel::TYPE_GROUP_MAKE;
|
||
|
||
$res = $this->spuList($params);
|
||
|
||
return $this->json(0, 'success', $res);
|
||
}
|
||
|
||
$this->data['statusList'] = SpuModel::statusTextList();
|
||
$this->data['spuTypeList'] = SpuModel::spuTypeTextList();
|
||
$this->data['type'] = SpuModel::TYPE_GROUP_MAKE;
|
||
$this->data['url'] = '/manager/mall/activity/group-make';
|
||
|
||
$this->data['mpPath'] = Config::MINI_PATH_SPU_INFO;
|
||
|
||
return $this->view('/manager/mall/activity/index');
|
||
}
|
||
|
||
/**
|
||
* 限时促销
|
||
*
|
||
* @return Json|View
|
||
*/
|
||
public function limitTime()
|
||
{
|
||
if ($this->request->isPost()) {
|
||
$params = input();
|
||
$params['type'] = SpuModel::TYPE_LIMIT_TIME;
|
||
|
||
$res = $this->spuList($params);
|
||
|
||
return $this->json(0, 'success', $res);
|
||
}
|
||
|
||
$this->data['statusList'] = SpuModel::statusTextList();
|
||
$this->data['spuTypeList'] = SpuModel::spuTypeTextList();
|
||
$this->data['type'] = SpuModel::TYPE_LIMIT_TIME;
|
||
$this->data['url'] = '/manager/mall/activity/limit-time';
|
||
|
||
$this->data['mpPath'] = Config::MINI_PATH_SPU_INFO;
|
||
|
||
return $this->view('/manager/mall/activity/index');
|
||
}
|
||
|
||
protected function spuList(array $params): array
|
||
{
|
||
$res = SpuRepository::getInstance()->activityList($params);
|
||
$res['list'] = $res['list']->each(function ($item) {
|
||
$status = '';
|
||
$now = date('Y-m-d H:i:s');
|
||
if ($item['activity_begin_at'] > $now) {
|
||
$status = '未开始';
|
||
}
|
||
|
||
if ($item['activity_begin_at'] < $now && $now < $item['activity_end_at']) {
|
||
$status = '进行中';
|
||
}
|
||
|
||
if ($item['is_activity_history'] == SpuModel::COMMON_ON || $item['activity_end_at'] < $now) {
|
||
$status = '已结束';
|
||
}
|
||
|
||
$item->status_text = $status;
|
||
});
|
||
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* @throws ModelNotFoundException
|
||
* @throws DbException
|
||
* @throws DataNotFoundException
|
||
* @throws Exception
|
||
*/
|
||
public function add()
|
||
{
|
||
$repo = SpuRepository::getInstance();
|
||
$type = input('type/s', SpuModel::TYPE_GROUP_BUY);
|
||
if (!in_array($type, SpuModel::activityList())) {
|
||
if ($this->request->isPost()) {
|
||
return $this->json(4000, '活动类型错误');
|
||
} else {
|
||
return $this->error('活动类型错误');
|
||
}
|
||
}
|
||
if ($this->request->isPost()) {
|
||
$item = $this->request->param('item/a', []);
|
||
$sku = $this->request->param('sku/a', []);
|
||
$spuId = $this->request->param('spu_id/d', 0);
|
||
|
||
$rules = [
|
||
'cover|活动封面' => 'require',
|
||
'activity_begin_at|开始时间' => 'require|date',
|
||
'activity_end_at|结束时间' => 'require|date',
|
||
];
|
||
|
||
$validate = $this->validateByApi($item, $rules);
|
||
if ($validate !== true) {
|
||
return $validate;
|
||
}
|
||
|
||
$item['is_score'] = SpuModel::COMMON_OFF;
|
||
$item['is_activity'] = SpuModel::COMMON_ON;
|
||
$item['activity_type'] = $type;
|
||
|
||
try {
|
||
foreach ($sku as &$val) {
|
||
if (isset($val['id'])) {
|
||
unset($val['id']);
|
||
}
|
||
}
|
||
|
||
$this->checkSku($sku);
|
||
$repo->addActivity($type, $item, $spuId, $sku);
|
||
} catch (RepositoryException $e) {
|
||
return $this->json(4002, $e->getMessage());
|
||
} catch (Exception $e) {
|
||
}
|
||
|
||
return $this->json();
|
||
}
|
||
|
||
$this->data['type'] = $type;
|
||
$this->data['limitList'] = SpuModel::limitList();
|
||
$this->data['limitFields'] = SpuRepository::getInstance()->activityFields($type);
|
||
|
||
return $this->view();
|
||
}
|
||
|
||
/**
|
||
* @throws DataNotFoundException
|
||
* @throws ModelNotFoundException
|
||
* @throws DbException
|
||
*/
|
||
public function edit()
|
||
{
|
||
$id = $this->request->param('id/d', 0);
|
||
$skuList = Sku::where('spu_activity_id', $id)
|
||
->where('enable', Sku::COMMON_ON)
|
||
->order('sort', 'asc')
|
||
->order('id', 'asc')->select()->toArray();
|
||
|
||
if ($this->request->isPost()) {
|
||
$item = $this->request->param('item/a', []);
|
||
$sku = $this->request->param('sku/a', []);
|
||
try {
|
||
$this->checkSku($sku);
|
||
|
||
SpuRepository::getInstance()->editActivity($id, $item, $sku, $skuList);
|
||
} catch (RepositoryException $e) {
|
||
return $this->json(4002, $e->getMessage());
|
||
} catch (Exception $e) {
|
||
}
|
||
|
||
return $this->json();
|
||
}
|
||
|
||
$spuActivity = SpuActivity::findById($id);
|
||
if (empty($spuActivity)) {
|
||
return $this->json(4000, '没有相关的商品记录!');
|
||
}
|
||
|
||
foreach ($skuList as &$val) {
|
||
$val['price'] = Math::fen2Yuan($val['price']);
|
||
$val['original_price'] = Math::fen2Yuan($val['original_price']);
|
||
}
|
||
|
||
$this->data['item'] = $spuActivity;
|
||
$this->data['skuList'] = $skuList;
|
||
$this->data['limitList'] = SpuModel::limitList();
|
||
$this->data['limitFields'] = SpuRepository::getInstance()->activityFields($spuActivity['activity_type']);
|
||
$this->data['id'] = $id;
|
||
return $this->view();
|
||
}
|
||
|
||
/**
|
||
* @throws RepositoryException
|
||
* @throws Exception
|
||
*/
|
||
protected function checkSku(array $sku)
|
||
{
|
||
// sku验证
|
||
if (empty($sku)) {
|
||
throw new RepositoryException('规格信息不能为空');
|
||
}
|
||
|
||
foreach ($sku as $k) {
|
||
$validate = $this->validateByApi($k, [
|
||
'title' => 'require',
|
||
'stock' => 'require|number|gt:0',
|
||
'price' => 'number',
|
||
'score' => 'number',
|
||
'is_default' => 'require|in:0,1',
|
||
]);
|
||
|
||
if ($validate !== true) {
|
||
return $validate;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @throws ModelNotFoundException
|
||
* @throws DbException
|
||
* @throws DataNotFoundException
|
||
* @throws Exception
|
||
*/
|
||
public function modify()
|
||
{
|
||
if (!$this->request->isPost()) {
|
||
return $this->json(4000, '非法请求');
|
||
}
|
||
|
||
$item = input('post.');
|
||
$validate = $this->validateByApi($item, [
|
||
'field' => 'require',
|
||
'value' => 'require',
|
||
]);
|
||
|
||
if ($validate !== true) {
|
||
return $validate;
|
||
}
|
||
|
||
if (!$info = SpuActivity::findById($item['id'])) {
|
||
return $this->json(4001, '记录不存在');
|
||
}
|
||
|
||
$update = [$item['field'] => $item['value']];
|
||
|
||
try {
|
||
$info->save($update);
|
||
if ($item['field'] == 'is_check' && $info['is_activity_history'] == SpuModel::COMMON_OFF) {
|
||
SpuModel::where('id', $info['spu_id'])->save(['is_check' => $item['value']]);
|
||
}
|
||
return $this->json();
|
||
} catch (ValidateException $e) {
|
||
return $this->json(4001, $e->getError());
|
||
} catch (Exception $e) {
|
||
return $this->json(5000, '修改失败');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 立即结束-还原为普通商品
|
||
*
|
||
* @return Json
|
||
*/
|
||
public function end(): Json
|
||
{
|
||
if (!$this->request->isPost()) {
|
||
return $this->json(4000, '非法请求');
|
||
}
|
||
|
||
$ids = $this->request->param('ids/a', []);
|
||
if (empty($ids)) {
|
||
$ids[] = $this->request->param('id/d', 0);
|
||
$ids = array_filter($ids);
|
||
}
|
||
|
||
try {
|
||
if (count($ids)) {
|
||
SpuRepository::getInstance()->restore($ids);
|
||
Log::write(get_class(), 'end', '还原了活动商品,涉及到的ID为:'.implode(',', $ids));
|
||
}
|
||
} catch (RepositoryException $e) {
|
||
return $this->json(4001, $e->getMessage());
|
||
}
|
||
|
||
return $this->json();
|
||
}
|
||
|
||
/**
|
||
* 删除-还原为普通商品且隐藏
|
||
*
|
||
* @return Json
|
||
*/
|
||
public function del(): Json
|
||
{
|
||
if (!$this->request->isPost()) {
|
||
return $this->json(4000, '非法请求');
|
||
}
|
||
|
||
$ids = $this->request->param('ids/a', []);
|
||
if (empty($ids)) {
|
||
$ids[] = $this->request->param('id/d', 0);
|
||
$ids = array_filter($ids);
|
||
}
|
||
|
||
try {
|
||
if (count($ids)) {
|
||
SpuRepository::getInstance()->restore($ids, false, true);
|
||
// (new SpuActivity())->whereIn('id', $ids)->save(['deleted_at' => date('Y-m-d H:i:s')]);
|
||
Log::write(get_class(), 'del', '还原了活动商品,涉及到的ID为:'.implode(',', $ids));
|
||
}
|
||
} catch (RepositoryException $e) {
|
||
return $this->json(4001, $e->getMessage());
|
||
}
|
||
|
||
return $this->json();
|
||
}
|
||
|
||
|
||
/**
|
||
* 活动商品详情
|
||
*
|
||
* @return View
|
||
* @throws DataNotFoundException
|
||
* @throws DbException
|
||
* @throws ModelNotFoundException
|
||
* @throws Exception
|
||
*/
|
||
public function info(): View
|
||
{
|
||
$id = input('id/d', 0);
|
||
$item = SpuActivity::findById($id);
|
||
|
||
$status = '';
|
||
$now = date('Y-m-d H:i:s');
|
||
if ($item['activity_begin_at'] > $now) {
|
||
$status = '未开始';
|
||
}
|
||
|
||
if ($item['activity_begin_at'] < $now && $now < $item['activity_end_at']) {
|
||
$status = '进行中';
|
||
}
|
||
|
||
if ($item['is_activity_history'] == SpuModel::COMMON_ON || $item['activity_end_at'] < $now) {
|
||
$status = '已结束';
|
||
}
|
||
|
||
$item->status_text = $status;
|
||
|
||
if ($item->activity_type == SpuModel::TYPE_GROUP_MAKE) {
|
||
//拼团
|
||
$orderList = SpuRepository::getInstance()->getActivityGroupList($id);
|
||
} else {
|
||
// 团购 促销
|
||
$orderList = SpuRepository::getInstance()->getActivityOrderList($id);
|
||
}
|
||
|
||
$totalPriceList = $orderList['list']->where('is_paid', SpuActivity::COMMON_ON)->column('total_price');
|
||
$codingList = $orderList['list']->column('coding');
|
||
$accountList = $orderList['list']->column('account_id');
|
||
$codingCount = count(array_unique($codingList));
|
||
$accountCount = count(array_unique($accountList));
|
||
$totalPrice = array_sum($totalPriceList);
|
||
$item->total_money = Math::fen2Yuan($totalPrice) ?? 0;
|
||
$item->order_count = $codingCount;
|
||
$item->account_count = $accountCount;
|
||
|
||
$this->data['item'] = $item;
|
||
$this->data['statusList'] = \app\model\Order::statusTextList();
|
||
$this->data['activityList'] = SpuModel::activityTextList();
|
||
$this->data['limitList'] = SpuModel::limitList();//限购天数展示
|
||
|
||
return $this->view();
|
||
}
|
||
|
||
/**
|
||
* 获取活动商品的订单列表
|
||
*
|
||
* @return Json
|
||
* @throws Exception
|
||
*/
|
||
public function getOrder(): Json
|
||
{
|
||
$id = input('id/d', 0);
|
||
$page = input('page/d', 1);
|
||
$size = input('size/d', 20);
|
||
|
||
$res = SpuRepository::getInstance()->getActivityOrderList($id, $page, $size);
|
||
|
||
return $this->json(0, '操作成功', $res);
|
||
}
|
||
|
||
/**
|
||
* 获取拼团列表
|
||
*
|
||
* @return Json
|
||
* @throws Exception
|
||
*/
|
||
public function getOrderGroupList(): Json
|
||
{
|
||
$id = input('id/d', 0);
|
||
$page = input('page/d', 1);
|
||
$size = input('size/d', 20);
|
||
|
||
$res = SpuRepository::getInstance()->getActivityGroupList($id, $page, $size);
|
||
|
||
return $this->json(0, '操作成功', $res);
|
||
}
|
||
|
||
/**
|
||
* 批量审核
|
||
*
|
||
* @return View|Json
|
||
* @throws Exception
|
||
*/
|
||
public function check()
|
||
{
|
||
$id = input('id/s', '');
|
||
if ($this->request->isPost()) {
|
||
$ids = input('ids/s');
|
||
$check = input('is_check/d');
|
||
|
||
if (!in_array($check, [SpuActivity::COMMON_ON, SpuActivity::COMMON_OFF])) {
|
||
return $this->json(4001, '请选择是否展示');
|
||
}
|
||
|
||
$ids = explode(',', $ids);
|
||
|
||
Db::startTrans();
|
||
try {
|
||
(new SpuActivity())->whereIn('id', $ids)->save(['is_check' => $check]);
|
||
// 活动商品对应的普通商品审核状态同步
|
||
$spuIds = SpuActivity::whereid('id', $ids)
|
||
->where('is_activity_history', SpuActivity::COMMON_OFF)
|
||
->column('spu_id');
|
||
SpuModel::whereIn('id', $spuIds)->save(['is_check' => $check]);
|
||
Db::commit();
|
||
return $this->json(0, '操作成功');
|
||
} catch (Exception $e) {
|
||
Db::rollback();
|
||
Log::error('活动商品批量审核操作失败'.$e->getMessage());
|
||
return $this->json(5001, '商品批量审核操作失败');
|
||
}
|
||
}
|
||
|
||
$this->data['id'] = $id;
|
||
|
||
return $this->view();
|
||
}
|
||
|
||
} |