'ID', 'mall_id' => 'Mall ID', 'user_id' => 'User ID', 'card_num' => 'Card Num', 'clue_num' => 'Clue Num', 'browse_num' => 'Browse Num', 'share_num' => 'Share Num', 'like_num' => 'Like Num', 'order_num' => 'Order Num', 'order_money' => 'Order Money', 'status' => 'Status', 'created_at' => 'Created At', 'updated_at' => 'Updated At', ]; } public function getUser() { return $this->hasOne(User::class, ['id' => 'user_id']); } /** * @author hpei * @param array $params * @param array $select * @param string|null $group * @return array */ public static function getList($where, $select = '*', $group = '') { $where[] = ['<>','status',StatusEnum::DELETE]; $model = self::find(); $params['where'] = $where; $params['select'] = $select; if ($group !== '') $params['group'] = $group; self::paramPack($params, $model); return $model->asArray()->all(); } /** * 获取排行榜 * @author hpei * @param int mall_id * @param string type money|num * @return array [user_id=>num] */ public static function rank($param) { $key = $param['type'] == 'money' ? RedisKeyEnum::CARD_ORDER_MONEY_STATISTICS : RedisKeyEnum::CARD_ORDER_NUM_STATISTICS; $cacheKey = RedisKeyEnum::suffix($key, 'mall_id_'. $param['mall_id']); $redis = Yii::$app->redis; $rank = $redis->zrevrange($cacheKey, 0, 9, 'WITHSCORES'); if (empty($rank)) { $model = self::find() ->where(['mall_id' => $param['mall_id']]) ->orderBy('count desc') ->groupBy('user_id') ->indexBy('user_id') ->limit(10); if ($param['type'] == 'money') { $model->select(['sum(order_money) as count', 'user_id']); } else { $model->select(['sum(order_num) as count', 'user_id']); } $list = $model->asArray()->all(); if (!empty($list)) { $options = []; foreach ($list as $val) { array_push($options, $val['count'], 'user_id:' . $val['user_id']); } $redis->zadd($cacheKey, ...$options); } } else { for ($i = 0; $i < count($rank); $i++) { if ($i %2 == 0) { $user_id = explode(':', $rank[$i])[1]; $list[$i] = ['user_id' => $user_id, 'count' => 0]; } else { $list[$i - 1]['count'] = $rank[$i]; } } $list = array_values($list); } return $list; } /** * 保存数据 * @author hpei * @return bool|Exception */ public static function setData($params) { try { $model = self::find() ->where(['user_id' => $params['user_id'], 'mall_id' => $params['mall_id']]) ->andWhere(['>=', 'created_at', strtotime('today 0:0:0')]) ->andWhere(['<=', 'created_at', strtotime('today 23:59:59')]) ->one(); if (empty($model)) { $model = new self(); $model->user_id = $params['user_id']; $model->mall_id = $params['mall_id']; } unset($params['user_id'], $params['mall_id']); foreach ($model as $key => $val) { if (isset($params[$key]) && !empty($params[$key])) $model->$key += $params[$key]; } if (!$model->save()) throw new \Exception($model->getErrorMessage()); return $model->id; } catch (\Exception $e) { self::$static_error = $e->getMessage(); return false; } } /** * 概况数据 * @author hpei * @param int date * @param array|int ids * @return array */ public static function survey($date, $ids) { if(!empty($date)) { $start_time = strtotime("-$date day 0:0:0"); $end_time = $start_time + ($date - 1) * 86400 + 86399; $where[] = ['>', 'created_at', $start_time]; $where[] = ['<=', 'created_at', $end_time]; } $where[] = ['in', 'user_id', $ids]; $data = []; //订单数,付款金额 $statisticsMDL = BusinessCardStatistics::find(); $params = [ 'where' => $where, 'select' => ['sum(order_num) order_num', 'sum(order_money) order_money'] ]; BusinessCardStatistics::paramPack($params, $statisticsMDL); $statistics = $statisticsMDL->asArray()->one(); $data['order_num'] = isset($statistics['order_num']) ? $statistics['order_num'] : 0; $data['order_money'] = isset($statistics['order_money']) ? $statistics['order_money'] : 0; //客户类型 $user_menu = [CardEnums::CUSTOMER_TYPE_INTENTION, CardEnums::CUSTOMER_TYPE_COMPARE, CardEnums::CUSTOMER_TYPE_ORDER]; $user_where = $where; $user_where[] = ['in', 'customer_type', $user_menu]; $userMDL = BusinessCardUser::find(); $params = [ 'where' => $user_where, 'select' => ['count(*) count', 'customer_type'], 'group' => 'customer_type', 'index' => 'customer_type' ]; BusinessCardUser::paramPack($params, $userMDL); $statistics = $userMDL->asArray()->all(); $data['intention_customer'] = isset($statistics[CardEnums::CUSTOMER_TYPE_INTENTION]) ? $statistics[CardEnums::CUSTOMER_TYPE_INTENTION]['count'] : 0;//意向 $data['compare_customer'] = isset($statistics[CardEnums::CUSTOMER_TYPE_COMPARE]) ? $statistics[CardEnums::CUSTOMER_TYPE_COMPARE]['count'] : 0;//比较 $data['order_customer'] = isset($statistics[CardEnums::CUSTOMER_TYPE_ORDER]) ? $statistics[CardEnums::CUSTOMER_TYPE_ORDER]['count'] : 0;//待成交 //新增客户,浏览量,线索,下单人数 $log_menu = [CardEnums::LOG_TYPE_USER, CardEnums::LOG_TYPE_CLUE, CardEnums::LOG_TYPE_CARD, CardEnums::LOG_TYPE_ORDER]; $log_where = $where; $log_where = [['in', 'log_type', $log_menu]]; $params = [ 'where' => $log_where, 'group' => 'log_type', 'index' => 'log_type', 'select' => ['count(*) count', 'log_type'] ]; $logMDL = BusinessCardCustomerLog::find(); BusinessCardCustomerLog::paramPack($params, $logMDL); $statistics = $logMDL->asArray()->all(); $data['add_user'] = isset($statistics[CardEnums::LOG_TYPE_USER]) ? $statistics[CardEnums::LOG_TYPE_USER]['count'] : 0;//新增用户 $data['browse_num'] = isset($statistics[CardEnums::LOG_TYPE_CARD]) ? $statistics[CardEnums::LOG_TYPE_CARD]['count'] : 0;//卡片浏览量 $data['add_clue'] = isset($statistics[CardEnums::LOG_TYPE_CLUE]) ? $statistics[CardEnums::LOG_TYPE_CLUE]['count'] : 0;//新增线索 $data['order_people_num'] = isset($statistics[CardEnums::LOG_TYPE_ORDER]) ? $statistics[CardEnums::LOG_TYPE_ORDER]['count'] : 0;//下单人数 return $data; } }