caipan_shop_admin/app/controller/manager/mall/Activity.php

494 lines
15 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
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();
}
}