367 lines
13 KiB
PHP
367 lines
13 KiB
PHP
<?php
|
||
|
||
// +----------------------------------------------------------------------
|
||
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||
// +----------------------------------------------------------------------
|
||
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
|
||
// +----------------------------------------------------------------------
|
||
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||
// +----------------------------------------------------------------------
|
||
// | Author: CRMEB Team <admin@crmeb.com>
|
||
// +----------------------------------------------------------------------
|
||
|
||
namespace app\common\repositories\store;
|
||
|
||
use app\common\dao\store\StoreSeckillActiveDao;
|
||
use app\common\repositories\BaseRepository;
|
||
use app\common\repositories\store\order\StoreOrderProductRepository;
|
||
use app\common\repositories\store\order\StoreOrderRepository;
|
||
use app\common\repositories\store\product\ProductRepository;
|
||
use app\common\repositories\store\product\SpuRepository;
|
||
use app\common\repositories\user\UserRepository;
|
||
use app\controller\api\store\product\StoreSpu;
|
||
use think\db\exception\DataNotFoundException;
|
||
use think\db\exception\DbException;
|
||
use think\db\exception\ModelNotFoundException;
|
||
use think\exception\ValidateException;
|
||
use think\facade\Db;
|
||
|
||
class StoreSeckillActiveRepository extends BaseRepository
|
||
{
|
||
|
||
/**
|
||
* @var StoreSeckillActiveDao
|
||
*/
|
||
protected $dao;
|
||
|
||
protected $filed = 'seckill_active_id,name,seckill_time_ids,start_day,end_day,once_pay_count,all_pay_count,product_category_ids,status,active_status,product_count,merchant_count,create_time,update_time';
|
||
|
||
/**
|
||
* StoreSeckillActiveDao constructor.
|
||
* @param StoreSeckillActiveDao $dao
|
||
*/
|
||
public function __construct(StoreSeckillActiveDao $dao)
|
||
{
|
||
$this->dao = $dao;
|
||
}
|
||
|
||
/**
|
||
* 获取秒杀活动列表
|
||
* @param array $where
|
||
* @param int $page
|
||
* @param int $limit
|
||
* @return array
|
||
* FerryZhao 2024/4/11
|
||
*/
|
||
public function getList(array $where, int $page, int $limit, array $append = [])
|
||
{
|
||
$query = $this->dao->search($where)->append($append);
|
||
$count = $query->count();
|
||
$list = $query->page($page, $limit)->setOption('field', [])->field($this->filed)->select();
|
||
return compact('count', 'list');
|
||
}
|
||
|
||
/**
|
||
* 返回所有列表
|
||
* @return
|
||
* FerryZhao 2024/4/12
|
||
*/
|
||
public function getActiveAll()
|
||
{
|
||
return $this->dao->getSearch([])->where('status', '=', 1)->where('active_status', '<>', -1)->field('name as lable,seckill_active_id as value,active_status')->select();
|
||
}
|
||
|
||
/**
|
||
* 创建秒杀活动
|
||
* @param $data
|
||
* @return object
|
||
* FerryZhao 2024/4/11
|
||
*/
|
||
public function create($data)
|
||
{
|
||
//场次ID
|
||
if (isset($data['seckill_time_ids']) && !empty($data['seckill_time_ids'])) {
|
||
$data['seckill_time_ids'] = implode(',', $data['seckill_time_ids']);
|
||
}
|
||
//活动平台商品一级分类
|
||
if (isset($data['product_category_ids']) && !empty($data['product_category_ids'])) {
|
||
$data['product_category_ids'] = implode(',', $data['product_category_ids']);
|
||
}
|
||
$activity = app()->make(StoreActivityRepository::class);
|
||
$result = $this->dao->create($data);
|
||
if (!$result) {
|
||
throw new ValidateException('活动添加失败');
|
||
}
|
||
|
||
if (isset($data['border_pic']) && !empty($data['border_pic'])) {
|
||
//边框图
|
||
$activity->saveByType([
|
||
'activity_name' => $data['name'],
|
||
'start_time' => $data['start_day'],
|
||
'end_time' => $data['end_day'],
|
||
'pic' => $data['border_pic'],
|
||
'link_id' => $result->seckill_active_id,
|
||
'activity_type' => $activity::ACTIVITY_TYPE_BORDER
|
||
], 1);
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
|
||
/**
|
||
* 添加商品修改商家数量和商品数量
|
||
* @return true|void
|
||
* FerryZhao 2024/4/24
|
||
*/
|
||
public function updateActiveChart($activeId)
|
||
{
|
||
$productRepository = app()->make(ProductRepository::class);
|
||
$productCount = $productRepository->getSearch([])->where(['active_id' => $activeId, 'is_del' => 0])->count();
|
||
$merchantCount = $productRepository->getSearch([])->where(['active_id' => $activeId, 'is_del' => 0])->group('mer_id')->count();
|
||
$this->dao->update($activeId, ['product_count' => $productCount, 'merchant_count' => $merchantCount]);
|
||
}
|
||
|
||
|
||
/**
|
||
* 编辑秒杀活动
|
||
* @param int $activeId 活动ID
|
||
* @param $data
|
||
* @return void
|
||
* FerryZhao 2024/4/12
|
||
*/
|
||
public function updateActive(int $activeId, $data)
|
||
{
|
||
if (!$activeId) {
|
||
throw new ValidateException('活动ID参数错误');
|
||
}
|
||
$activeInfo = $this->dao->get($activeId);
|
||
if (!$activeInfo) {
|
||
throw new ValidateException('数据不存在');
|
||
}
|
||
//场次ID
|
||
if (isset($data['seckill_time_ids']) && !empty($data['seckill_time_ids'])) {
|
||
$data['seckill_time_ids'] = implode(',', $data['seckill_time_ids']);
|
||
}
|
||
//活动平台商品一级分类
|
||
if (isset($data['product_category_ids']) && !empty($data['product_category_ids'])) {
|
||
$data['product_category_ids'] = implode(',', $data['product_category_ids']);
|
||
}
|
||
$result = $activeInfo->save($data);
|
||
if (!$result) {
|
||
throw new ValidateException('编辑失败');
|
||
}
|
||
$activity = app()->make(StoreActivityRepository::class);
|
||
|
||
if (isset($data['border_pic']) && !empty($data['border_pic'])) {
|
||
//边框图
|
||
$activity->saveByType([
|
||
'activity_name' => $data['name'],
|
||
'start_time' => $data['start_day'],
|
||
'end_time' => $data['end_day'],
|
||
'pic' => $data['border_pic'],
|
||
'link_id' => $activeId,
|
||
'activity_type' => $activity::ACTIVITY_TYPE_BORDER
|
||
], 1);
|
||
} else {
|
||
//删除边框
|
||
$activity->deleteSeckll($activeId);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 编辑秒杀活动状态
|
||
* @param $id
|
||
* @param $status
|
||
* @return void
|
||
* FerryZhao 2024/4/12
|
||
*/
|
||
public function updateStatus($id, $status)
|
||
{
|
||
if (!$this->dao->get($id)) {
|
||
throw new ValidateException('数据不存在');
|
||
}
|
||
$productRepository = app()->make(ProductRepository::class);
|
||
$storeSpu = app()->make(SpuRepository::class);
|
||
|
||
Db::transaction(function () use ($productRepository, $storeSpu,$id,$status) {
|
||
$result = $this->dao->update($id, ['status' => $status]);
|
||
$updateSpu = $productRepository->getSearch([])->where(['active_id'=>$id])->update(['is_used' => $status]);
|
||
$updateProduct = $storeSpu->getSearch([])->where(['activity_id'=>$id])->update(['status' => $status]);
|
||
});
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 删除秒杀活动
|
||
* @param $activeId 秒杀活动ID
|
||
* @return void
|
||
* FerryZhao 2024/4/12
|
||
* @throws DataNotFoundException
|
||
* @throws DbException
|
||
* @throws ModelNotFoundException
|
||
*/
|
||
public function deleteActive($activeId)
|
||
{
|
||
$activeInfo = $this->dao->get($activeId);
|
||
if (!$activeInfo) {
|
||
throw new ValidateException('数据不存在');
|
||
}
|
||
$deleteActive = $this->dao->update($activeId, ['delete_time' => time()]);
|
||
$deleteProduct = app()->make(ProductRepository::class)->getSearch([])->where('active_id', $activeId)->update(['is_del' => 1]);
|
||
app()->make(StoreActivityRepository::class)->deleteSeckll($activeId);
|
||
return compact('deleteActive', 'deleteProduct');
|
||
}
|
||
|
||
|
||
/**
|
||
* 平台管理端统计面板
|
||
* @param $id
|
||
* @param $merId
|
||
* @return array[]
|
||
* FerryZhao 2024/4/22
|
||
*/
|
||
public function chartPanel($id, $merId = null): array
|
||
{
|
||
$merchantWhere = [
|
||
'paid' => 1,
|
||
];
|
||
if ($merId) {
|
||
$merchantWhere['mer_id'] = $merId;
|
||
}
|
||
//初始化
|
||
$data = [
|
||
'orders_people_count' => 0,
|
||
'pay_order_money' => 0,
|
||
'pay_order_people_count' => 0,
|
||
'pay_order_count' => 0
|
||
];
|
||
|
||
$storeOrderRepository = app()->make(StoreOrderRepository::class);
|
||
$storeOrderProductRepository = app()->make(StoreOrderProductRepository::class);
|
||
|
||
|
||
//活动对应的订单商品表
|
||
$orderProductOrderIds = $storeOrderProductRepository->getSearch([])->where([
|
||
'activity_id' => $id,
|
||
'product_type' => 1
|
||
])->column('order_id');
|
||
if (!empty($orderProductOrderIds)) {
|
||
$data['orders_people_count'] = $storeOrderRepository->getSearch([])->where($merchantWhere)->where('status','>',-1)->whereIn('order_id', $orderProductOrderIds)->group('uid')->count();//下单人数
|
||
$data['pay_order_money'] = $storeOrderRepository->getSearch([])->where($merchantWhere)->where('status','>',-1)->where(['paid' => 1])->whereIn('order_id', $orderProductOrderIds)->sum('pay_price');;//支付订单金额
|
||
$data['pay_order_people_count'] = $storeOrderRepository->getSearch([])->where($merchantWhere)->where('status','>',-1)->where(['paid' => 1])->whereIn('order_id', $orderProductOrderIds)->group('uid')->count();//支付人数
|
||
$data['pay_order_count'] = $storeOrderRepository->getSearch([])->where($merchantWhere)->where('status','>',-1)->where(['paid' => 1])->whereIn('order_id', $orderProductOrderIds)->group('order_id')->count();//支付订单数
|
||
}
|
||
return [
|
||
[
|
||
'className' => 'el-icon-user-solid',
|
||
'count' => $data['orders_people_count'],
|
||
'field' => '人',
|
||
'name' => '下单人数'
|
||
],
|
||
[
|
||
'className' => 'el-icon-s-order',
|
||
'count' => (float)$data['pay_order_money'],
|
||
'field' => '元',
|
||
'name' => '支付订单额'
|
||
],
|
||
[
|
||
'className' => 'el-icon-s-check',
|
||
'count' => $data['pay_order_people_count'],
|
||
'field' => '人',
|
||
'name' => '支付人数'
|
||
],
|
||
[
|
||
'className' => 'el-icon-s-order',
|
||
'count' => $data['pay_order_count'],
|
||
'field' => '笔',
|
||
'name' => '支付订单数'
|
||
]
|
||
];
|
||
}
|
||
|
||
|
||
/**
|
||
* 活动参与人列表统计
|
||
* @param $activeId
|
||
* @param $merId
|
||
* @param $where
|
||
* @param int $page
|
||
* @param int $limit
|
||
* @return array
|
||
* FerryZhao 2024/4/28
|
||
*/
|
||
public function chartPeople($activeId, $merId = null, $where, int $page = 1, int $limit = 10): array
|
||
{
|
||
$result = $this->validateProduct($activeId, $merId);
|
||
if (!$result) {
|
||
return ['count' => 0, 'list' => []];
|
||
}
|
||
return $this->dao->chartPeople($activeId, $merId, $where, $page, $limit);
|
||
}
|
||
|
||
/**
|
||
* 活动订单统计列表
|
||
* @param $activeId
|
||
* @param $merId
|
||
* @param $where
|
||
* @param int $page
|
||
* @param int $limit
|
||
* @return array|null
|
||
* FerryZhao 2024/4/28
|
||
*/
|
||
public function chartOrder($activeId, $merId = null, $where, int $page = 1, int $limit = 10): ?array
|
||
{
|
||
$result = $this->validateProduct($activeId, $merId);
|
||
if (!$result) {
|
||
return ['count' => 0, 'list' => []];
|
||
}
|
||
$statusWhere = app()->make(StoreOrderRepository::class)->getOrderType($where['status']);
|
||
unset($where['status']);
|
||
return $this->dao->chartOrder($activeId, $merId, $where, $statusWhere, $page, $limit);
|
||
}
|
||
|
||
/**
|
||
* 活动商品统计列表
|
||
* @param $activeId
|
||
* @param $merId
|
||
* @param $where
|
||
* @param int $page
|
||
* @param int $limit
|
||
* @return array|null
|
||
* FerryZhao 2024/4/28
|
||
*/
|
||
public function chartProduct($activeId, $merId = null, $where, int $page = 1, int $limit = 10): ?array
|
||
{
|
||
$result = $this->validateProduct($activeId, $merId);
|
||
if (!$result) {
|
||
return ['count' => 0, 'list' => []];
|
||
}
|
||
return $this->dao->chartProduct($activeId, $merId, $where, $page, $limit);
|
||
}
|
||
|
||
/**
|
||
* 公用校验商品
|
||
* @param $activeId
|
||
* @param $merId
|
||
* @return false
|
||
* FerryZhao 2024/4/28
|
||
*/
|
||
public function validateProduct($activeId, $merId): bool
|
||
{
|
||
$productWhere = [
|
||
'active_id' => $activeId,
|
||
'product_type' => 1
|
||
];
|
||
if ($merId) {
|
||
$productWhere['mer_id'] = $merId;
|
||
}
|
||
$productIds = app()->make(ProductRepository::class)->getSearch([])->where($productWhere)->whereNotNull('active_id')->find();
|
||
if (empty($productIds)) {
|
||
return false;
|
||
} else {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
}
|