// +---------------------------------------------------------------------- namespace app\controller\cashier; use app\Request; use app\services\activity\seckill\StoreSeckillTimeServices; use app\services\user\UserServices; use app\services\activity\discounts\StoreDiscountsServices; use app\services\activity\promotions\StorePromotionsServices; use app\services\activity\promotions\StorePromotionsAuxiliaryServices; use app\services\activity\seckill\StoreSeckillServices; use app\services\product\product\StoreProductServices; use app\services\product\branch\StoreBranchProductServices; use think\facade\App; /** * 收银台优惠活动 */ class Promotions extends AuthController { protected $services; /** * StoreOrder constructor. * @param App $app * @param StorePromotionsServices $service */ public function __construct(App $app, StorePromotionsServices $service) { parent::__construct($app); $this->services = $service; } /** 获取门店适用的活动 * @param $type * @return mixed */ public function getPromotionInfo($type) { $where['promotions_type'] = $type; $where['type'] = 1; $where['status'] = 1; $where['applicable_type'] = '1,2'; $where['store_id'] = 0; $where['pid'] = 0; $where['is_del'] = 0; return $this->success($this->services->getgetPromotionListInfo($where,$this->storeId)); } /** * 获取活动商品数量信息 * @return mixed */ public function promotionsCount(StoreSeckillTimeServices $seckillTimeServices, StoreSeckillServices $seckillServices, StoreDiscountsServices $discountsServices, $uid) { $typeArr = [1 => 'time_discount', 2 => 'n_piece_n_discount', 3 => 'full_discount', 4 => 'full_give']; $where[] = []; $where['type'] = 1; $where['store_id'] = 0; $where['pid'] = 0; $where['is_del'] = 0; $where['status'] = 1; $where['promotionsTime'] = true; /** @var StoreProductServices $productServices */ $productServices = app()->make(StoreProductServices::class); /** @var StoreBranchProductServices $branchProductServices */ $branchProductServices = app()->make(StoreBranchProductServices::class); $storeProducts = $branchProductServices->getSearchList(['type' => 1, 'relation_id' => $this->storeId, 'status' => 7, 'pid' => -1], 0, 0, ['pid']); $not_ids = []; if ($storeProducts) { $not_ids = array_column($storeProducts, 'pid'); } $storeProducts = $branchProductServices->getSearchList(['type' => 1, 'relation_id' => $this->storeId, 'status' => 1, 'pid' => -1], 0, 0, ['pid']); $ids = []; if ($storeProducts) { $ids = array_column($storeProducts, 'pid'); } $result = []; foreach ($typeArr as $type => $key) { $where['promotions_type'] = $type; $product_where = []; $product_where['type'] = 1; $product_where['relation_id'] = $this->storeId; $product_where['is_verify'] = 1; $product_where['pids'] = $ids; $product_where['not_pids'] = $not_ids; //门店不展示卡密商品 $product_where['product_type'] = [0, 2, 4]; $product_where['is_show'] = 1; $product_where['is_del'] = 0; //存在一个全部商品折扣优惠活动 直接返回商品 if ($ids && !$this->services->count($where + ['product_partake_type' => 1])) { //正选并集 $mergeIds = function ($promotions) { $data = []; foreach ($promotions as $item) { $productIds = is_string($item['product_id']) ? explode(',', $item['product_id']) : $item['product_id']; $data = array_merge($data, $productIds); } return $data; }; $promotions = $this->services->getList($where + ['product_partake_type' => 2], 'id,product_id'); $product_where['pids'] = $promotions ? $mergeIds($promotions) : []; $notPromotions = $this->services->getList($where + ['product_partake_type' => 3], 'id,product_id'); //反选交集 /** @var StorePromotionsAuxiliaryServices $auxiliaryService */ $auxiliaryService = app()->make(StorePromotionsAuxiliaryServices::class); $intersectIds = function ($promotions) use ($auxiliaryService) { $data = []; foreach ($promotions as $item) { $productIds = is_string($item['product_id']) ? explode(',', $item['product_id']) : $item['product_id']; $productIds = $auxiliaryService->getColumn(['promotions_id' => $item['id'], 'type' => 1, 'is_all' => 1, 'product_id' => $productIds], 'product_id', '', true); if(!$productIds) { continue; } if ($data) { $data = array_intersect($data, $productIds); } else { $data = $productIds; } } return $data; }; $product_where['not_pids'] = array_merge($product_where['not_ids'] ?? [], $notPromotions ? $intersectIds($notPromotions) : []); } $count = 0; if ($product_where['pids'] && $this->services->count($where)) { $product_where['pids'] = array_merge(array_diff($product_where['pids'], $product_where['not_pids'])); unset($product_where['not_pids']); $product_where['is_vip_product'] = 0; $product_where['is_presale_product'] = 0; //门店不展示卡密商品 $product_where['product_type'] = [0, 2, 4]; if ($uid) { /** @var UserServices $user */ $user = app()->make(UserServices::class); $userInfo = $user->getUserCacheInfo((int)$uid); $is_vip = $userInfo['is_money_level'] ?? 0; $product_where['is_vip_product'] = $is_vip ? -1 : 0; } $count = $productServices->getCount($product_where); } $result[$key] = ['type' => $type, 'count' => $count]; } $result['seckill'] = ['type' => '5', 'count' => $seckillServices->getCountByTime($seckillTimeServices->getSeckillTime(), $ids, $not_ids)]; $result['discount'] = ['type' => '6', 'count' => $discountsServices->getDiscountsCount()]; return $this->success($result); } /** * 收银台获取活动商品列表 * @param $type * @return mixed * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function activityList(Request $request, $type, $uid) { $data = []; /** @var StoreBranchProductServices $branchProductServices */ $branchProductServices = app()->make(StoreBranchProductServices::class); $storeProducts = $branchProductServices->getSearchList(['type' => 1, 'relation_id' => $this->storeId, 'status' => 7, 'pid' => -1], 0, 0, ['pid']); $not_ids = []; if ($storeProducts) { $not_ids = array_column($storeProducts, 'pid'); } $storeProducts = $branchProductServices->getSearchList(['type' => 1, 'relation_id' => $this->storeId, 'status' => 1, 'pid' => -1], 0, 0, ['pid']); $ids = []; if ($storeProducts) { $ids = array_column($storeProducts, 'pid'); } $data['list'] = []; $data['count'] = 0; switch ($type) { case 1: case 2: case 3: case 4: [$staff_id, $promotions_id, $tourist_uid, $store_name] = $request->getMore([ ['staff_id', ''], ['promotions_id', 0], ['tourist_uid', ''],//虚拟用户uid ['store_name', ''] ], true); $this->services->setItem('store_id', $this->storeId) ->setItem('tourist_uid', $tourist_uid) ->setItem('staff_id', $staff_id) ->setItem('ids', $ids) ->setItem('not_ids', $not_ids) ->setItem('store_name', $store_name); $data = $this->services->getTypeList((int)$type, (int)$uid, (int)$promotions_id); $this->services->reset(); break; case 5: /** @var StoreSeckillTimeServices $seckillTimeServices */ $seckillTimeServices = app()->make(StoreSeckillTimeServices::class); /** @var StoreSeckillServices $seckillServices */ $seckillServices = app()->make(StoreSeckillServices::class); $timeId = (int)$seckillTimeServices->getSeckillTime(); $data['list'] = $seckillServices->getListByTime($timeId, $ids, true); $data['count'] = $seckillServices->getCountByTime($timeId, $ids); break; case 6: $where['is_del'] = 0; $where['status'] = 1; $where['is_time'] = 1; /** @var StoreDiscountsServices $discountsServices */ $discountsServices = app()->make(StoreDiscountsServices::class); $data = $discountsServices->getList($where); break; } return $this->success($data); } }