123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- <?php
- namespace addons\shopro\library\activity\getter;
- class Db extends Base
- {
- /**
- * 获取所有给定类型给定状态的活动
- *
- * @param array $activityTypes
- * @return array
- */
- public function getActivities($activityTypes, $status = 'all')
- {
- $status = is_array($status) ? $status : [$status];
- $activities = $this->model->where('type', 'in', $activityTypes);
- if (!in_array('all', $status)) {
- $activities = $activities->statusComb($status);
- }
- $activities = $activities->select();
- return $activities;
- }
- /**
- * 获取指定时间区间内的活动
- *
- * @param array $range
- * @param array $activityTypes
- * @param string $range_type overlap=只要区间有重叠的就算|contain=包含,必须在这个区间之内的
- * @return array
- */
- public function getActivitiesByRange($range, $activityTypes = [], $range_type = 'overlap')
- {
- $activities = $this->model->where('type', 'in', $activityTypes);
- if ($range_type == 'overlap') {
- $activities = $activities->where('start_time', '<=', $range[1])->where('end_time', '>=', $range[0]);
- } elseif ($range_type == 'contain') {
- $activities = $activities->where('start_time', '>=', $range[0])->where('end_time', '<=', $range[1]);
- }
- $activities = $activities->select();
- return $activities;
- }
- /**
- * 获取商品的所有正在进行,或正在预售的活动
- *
- * @param integer $goods_id
- * @return array
- */
- public function getGoodsActivitys($goods_id)
- {
- $classify = $this->model->classifies();
- $activityTypes = array_keys($classify['activity']);
- $activities = $this->model->show()->where('find_in_set(:id,goods_ids)', ['id' => $goods_id])
- ->with(['activity_sku_prices' => function ($query) use ($goods_id) {
- $query->where('goods_id', $goods_id)
- ->where(
- 'status',
- 'up'
- );
- }])
- ->where('type', 'in', $activityTypes)
- ->order('start_time', 'asc') // 优先查询最先开始的活动(允许商品同时存在多个活动中, 只要开始结束时间不重合)
- ->select();
- return $activities;
- }
- /**
- * 获取商品的所有正在进行,或正在预售的营销
- *
- * @param integer $goods_id
- * @return array
- */
- public function getGoodsPromos($goods_id)
- {
- $classify = $this->model->classifies();
- $activityTypes = array_keys($classify['promo']);
- $promos = $this->model->show()
- ->where(function ($query) use ($goods_id) {
- // goods_ids 里面有当前商品,或者 goods_ids 为null(所有商品都参与)
- $query->where('find_in_set('. $goods_id .',goods_ids)')
- ->whereOr('goods_ids', null)
- ->whereOr('goods_ids', '');
- })
- ->where('type', 'in', $activityTypes)
- ->order('start_time', 'asc') // 优先查询最先开始的活动(允许商品同时存在多个活动中, 只要开始结束时间不重合)
- ->select();
- return $promos;
- }
- /**
- * 通过 活动 id 获取指定活动
- *
- * @param integer $goods_id
- * @param integer $activity_id
- * @return array
- */
- public function getGoodsActivityByActivity($goods_id, $activity_id)
- {
- $classify = $this->model->classifies();
- $activityTypes = array_keys($classify['activity']);
- $activity = $this->model->where('id', $activity_id)->find();
- if ($activity) {
- $goods_ids = array_values(array_filter(explode(',', $activity->goods_ids)));
- if (!in_array($goods_id, $goods_ids) && !empty($goods_ids)) {
- return null;
- }
-
- if (in_array($activity['type'], $activityTypes)) {
- // 活动规格
- $activity->activity_sku_prices = $activity->activity_sku_prices;
- }
- $activity = $activity->toArray();
- }
- return $activity;
- }
- }
|