'ID', 'mall_id' => 'Mall ID', 'status' => '状态[1启用 0禁用 -1删除]', 'join_user_num' => '参与活动人数', 'new_user_num' => '拉新人数', 'activity_num' => '新增活动数量', 'order_money_num' => '业绩总额', 'share_num' => '分享次数', 'share_visit' => '分享访问次数', 'date' => '日期(格式是:2020-06-01)', 'created_at' => '创建时间', 'updated_at' => '修改时间', ]; } public static function setData($params) { try { if (empty($params['mall_id']) || empty($params['date'])) return false; $model = self::findOne(['mall_id' => $params['mall_id'], 'date' => $params['date'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]); if (empty($model)) { $model = new self(); $model->date = $params['date']; $model->mall_id = $params['mall_id']; $model->loadDefaultValues(); } if (!empty($params['join_user_num'])) $model->join_user_num += $params['join_user_num']; if (!empty($params['new_user_num'])) $model->new_user_num += $params['new_user_num']; if (!empty($params['activity_num'])) $model->activity_num += $params['activity_num']; if (!empty($params['order_money_num'])) $model->order_money_num += $params['order_money_num']; if (!empty($params['share_num'])) $model->share_num += $params['share_num']; if (!empty($params['share_visit'])) $model->share_visit += $params['share_visit']; if (!$model->save()) throw new \Exception($model->getErrorMessage()); return $model; } catch (\Exception $e) { self::$static_error = $e->getMessage(); return false; } } /** * 指定时间内活动数量统计 返回总数 * @param $mall_id * @param $start 开始时间戳 * @param $end 结束时间戳 * @param $field * @return int|mixed */ public static function pkAcitivityNumCount($mall_id, $start, $end, $field = 'activity_num') { $start = date("Y-m-d", $start); $end = date("Y-m-d", $end); $number = PkDateStatistic::find() ->where(array('status' => StatusEnum::ENABLED)) ->where(array('mall_id' => $mall_id)) ->andWhere(array('>=', 'date', $start)) ->andWhere(array('<=', 'date', $end)) ->sum($field); return (float) $number; } /** * 指定时间内活动数量统计 返回指定时间段内统计列表 * @param $mall_id * @param $start * @param $end * @param $field * @return array */ public static function pkActivityNumCountList($mall_id, $start, $end, $field) { $start_date = date("Y-m-d", $start); $end_date = date("Y-m-d", $end); $select = ["$field as number", "date"]; $data = PkDateStatistic::find() ->where(array('status' => StatusEnum::ENABLED)) ->where(array('mall_id' => $mall_id)) ->andFilterWhere(array('>=', 'date', $start_date)) ->andFilterWhere(array('<=', 'date', $end_date)) ->select($select) ->asArray()->all(); $day_key_list = array_column($data, 'number','date'); return self::dealDaytimeData($day_key_list, $start, $end); } // 指定时间内活动数量统计 返回指定时间段内列表 public static function pkActivityNumList($mall_id, $start, $end, $field) { $start = date("Y-m-d", $start); $end = date("Y-m-d", $end); $select = "$field as num,date"; $data = PkDateStatistic::find() ->where(array('status' => StatusEnum::ENABLED)) ->where(array('mall_id' => $mall_id)) ->andFilterWhere(array('>=', 'date', $start)) ->andFilterWhere(array('<=', 'date', $end)) ->select($select) ->asArray()->all(); $day_by_day_list = self::_getNewDayByDayData($data, $start, $end, 'invite'); return array( 'personal' => array('keys' => array_keys($day_by_day_list), 'values' => array_values($day_by_day_list)), ); } /** * 指定时间内拉新数 * @param $mall_id * @param int $activity_type 个人PK为 1 * @param int $start 开始时间戳 * @param int $end 结束时间戳 * @param bool $is_day_by_day 是否逐天统计 * @return array|int|null|string */ public static function pkInvitedNewUserNum($mall_id, $activity_type = 1, $start, $end, $is_day_by_day = false) { $query = PkInviteLog::find() ->where(array('status' => StatusEnum::ENABLED, 'mall_id' => $mall_id, 'activity_type' => $activity_type)) ->andWhere(array('between', 'created_at', $start, $end)); if ($is_day_by_day) { if ($start == 0 || $end == 0) return array('keys' => [], 'values' => []); $query = $query->select(["from_unixtime(created_at, '%Y-%m-%d') as daytime", "count(id) as number"]); //逐天统计,按天分组 $invite_list = $query->asArray()->groupBy(["daytime"])->all(); $day_key_list = array_column($invite_list, 'number','daytime'); return self::dealDaytimeData($day_key_list, $start, $end); } else { //统计总数 return (int) $query->count(); } } /** * 指定时间内销售业绩 * @param $mall_id * @param $activity_type * @param $start 开始时间戳 * @param $end 结束时间戳 * @param bool $is_day_by_day * @return array|int|mixed */ public static function pkPerformanceNum($mall_id, $activity_type, $start, $end, $is_day_by_day = false) { $query = PkPerformanceLog::find() ->where(array('status' => StatusEnum::ENABLED, 'mall_id' => $mall_id, 'activity_type' => $activity_type)) ->andWhere(array('between', 'created_at', $start, $end)); if ($is_day_by_day) { if ($start == 0 || $end == 0) return array('keys' => [], 'values' => []); $query = $query->select(["from_unixtime(created_at, '%Y-%m-%d') as daytime", "sum(money) as number"]); //逐天统计,按天分组 $performance_list = $query->asArray()->groupBy(["daytime"])->all(); $day_key_list = array_column($performance_list, 'number','daytime'); return self::dealDaytimeData($day_key_list, $start, $end); } else { //统计总数 return (float) $query->sum('money'); } } /** * 处理按天统计的数据,变成 echart 的数据格式 * @param $data [ ['2022-06-11' => '888'], ['2022-06-12' => '999'] ] * @param $start 开始时间戳 * @param $end 结束时间戳 * @return array */ public static function dealDaytimeData($data, $start, $end) { $keys = $values = []; $current_time = $start; do { $day = date('Y-m-d', $current_time); $keys[] = $day; $values[] = $data[$day] ?? 0; $next_day_time = strtotime("+1 day", $current_time); $current_time = $next_day_time; } while ($current_time <= $end && $end > $start); return compact('keys', 'values'); } //根据日期获取逐天统计 private static function _getNewDayByDayData($list, $start, $end, $secen = 'invite') { $day_by_day_list = array(); if (!empty($list)) { foreach ($list as $val) { $key = $val['date']; $performance = $val['num']; if (!isset($day_by_day_list[$key])) { $day_by_day_list[$key] = $performance; } else { $day_by_day_list[$key] += $performance; } } } //补足不存在的天 $no_start_date = date('Ymd', strtotime($start)); $no_end_date = date('Ymd', strtotime($end)); for ($no_start_date; $no_start_date <= $no_end_date; $no_start_date++) { $date = date('Y-m-d', strtotime($no_start_date)); if (!isset($day_by_day_list[$date])) $day_by_day_list[$date] = 0; } ksort($day_by_day_list); return $day_by_day_list; } //获取概况数据 public static function getGeneralSituation($mall_id, $type, $start, $end) { return array( 'activity_num' => self::pkAcitivityNumCount($mall_id, $start, $end, 'activity_num'), 'invited_new_user_num' => self::pkAcitivityNumCount($mall_id, $start, $end, 'new_user_num'), 'sale_performance_num' => self::pkAcitivityNumCount($mall_id, $start, $end, 'order_money_num'), 'participate_user_num' => self::pkAcitivityNumCount($mall_id, $start, $end, 'join_user_num'), 'share_times' => self::pkAcitivityNumCount($mall_id, $start, $end, 'share_num'), 'share_link_visit_num' => self::pkAcitivityNumCount($mall_id, $start, $end, 'share_visit'), ); } // 按天统计PK拉新数量 public static function pkInvitedNewUserCountByDay($mall_id, $start, $end) { return array( // 'personal' => self::pkInvitedNewUserNum($mall_id, PkEnum::ACTIVITY_TYPE_PERSON, $start, $end, true), 'personal' => self::pkActivityNumList($mall_id, $start, $end, 'new_user_num'), ); } // 按天统计PK业绩 public static function pkPerformanceCountByDay($mall_id, $start, $end) { return array( // 'personal' => self::pkPerformanceNum($mall_id, PkEnum::ACTIVITY_TYPE_PERSON, $start, $end, true), 'personal' => self::pkAcitivityNumCount($mall_id, $start, $end, 'new_user_num'), ); } // 获取指定活动业绩排名TOPN public static function getPerformanceRank($mall_id, $activity_id, $topn) { $activity = PkActivity::find()->where(array('id' => $activity_id))->asArray()->one(); if (empty($activity)) return []; $where = []; $with = ['user']; $where[] = ['=', 'mall_id', $mall_id]; $where[] = ['=', 'activity_id', $activity_id]; $where[] = ['>=', 'status', StatusEnum::DISABLED]; if($activity['performance_type'] == PkEnum::NEW_ACTIVE){ $order = 'new_user_num desc,id asc'; $where[] = ['>', 'new_user_num', 0]; }else{ $order = 'order_money_num desc,id asc'; $where[] = ['>', 'order_money_num', 0]; } $params = array('where' => $where, 'with' => $with, 'order' => $order, 'limit' => $topn); $list = PkActivityStatistic::listPage($params, false, true); return $list['list'] ?? []; } /** * 获取平台数据 * @param $params * @return array */ public static function getPkPanelData($params) { $scene = $params['scene'] ?: 'all'; $mall_id = $params['mall_id'] ?? 0; $general_situation_personal_start = $params['general_situation_personal_start'] ?? 0; $general_situation_personal_end = $params['general_situation_personal_end'] ?? 0; $pk_statistics_invited_new_start = $params['pk_statistics_invited_new_start'] ?? 0; $pk_statistics_invited_new_end = $params['pk_statistics_invited_new_end'] ?? 0; $pk_statistics_performance_start = $params['pk_statistics_performance_start'] ?? 0; $pk_statistics_performance_end = $params['pk_statistics_performance_end'] ?? 0; $personal_activity_id = $params['personal_activity_id'] ?? 0; $topn = $params['topn'] ?? 10; $return = array(); switch ($scene) { case 'all': //概况 $return['general_situation'] = array( // 个人PK概况 22 'personal' => self::getGeneralSituation($mall_id, PkEnum:: ACTIVITY_TYPE_PERSON, $general_situation_personal_start, $general_situation_personal_end), 'team' => [] ); //业绩pk $return['pk_statistics'] = array( // 拉新数据报表 22 // 'invited_new_user_chart' => self::pkInvitedNewUserCountByDay($mall_id, $pk_statistics_invited_new_start, $pk_statistics_invited_new_end), 'invited_new_user_chart' => self::pkActivityNumList($mall_id, $pk_statistics_invited_new_start, $pk_statistics_invited_new_end, 'new_user_num'), // 业绩数据报表 22 // 'performance_chart' => self::pkPerformanceCountByDay($mall_id, $pk_statistics_performance_start, $pk_statistics_performance_end), 'performance_chart' => self::pkActivityNumList($mall_id, $pk_statistics_invited_new_start, $pk_statistics_invited_new_end, 'order_money_num'), ); // //TOP 10排行榜 // $return['rank'] = array( // 'personal' => self::getPerformanceRank($mall_id,$personal_activity_id,$topn), // 'team' => self::getPerformanceRank($mall_id,$team_activity_id,$topn), // ); break; case 'general_situation' : $return['general_situation'] = array( // 个人PK概况 22 'personal' => self::getGeneralSituation($mall_id, PkEnum:: ACTIVITY_TYPE_PERSON, $general_situation_personal_start, $general_situation_personal_end), 'team' => [] ); break; case 'general_situation.personal' : $return['general_situation'] = array( // 个人PK概况 22 'personal' => self::getGeneralSituation($mall_id, PkEnum:: ACTIVITY_TYPE_PERSON, $general_situation_personal_start, $general_situation_personal_end), ); break; case 'pk_statistics' : $return['pk_statistics'] = array( // 拉新数据报表 22 'invited_new_user_chart' => self::pkInvitedNewUserCountByDay($mall_id, $pk_statistics_invited_new_start, $pk_statistics_invited_new_end), // 业绩数据报表 22 'performance_chart' => self::pkPerformanceCountByDay($mall_id, $pk_statistics_performance_start, $pk_statistics_performance_end), ); break; case 'pk_statistics.invited_new_user_chart' : $return['pk_statistics'] = array( // 拉新数据报表 22 'invited_new_user_chart' => self::pkInvitedNewUserCountByDay($mall_id, $pk_statistics_invited_new_start, $pk_statistics_invited_new_end), ); break; case 'pk_statistics.performance_chart' : $return['pk_statistics'] = array( // 业绩数据报表 22 'performance_chart' => self::pkPerformanceCountByDay($mall_id, $pk_statistics_performance_start, $pk_statistics_performance_end), ); break; case 'rank' : $return['rank'] = array( 'personal' => self::getPerformanceRank($mall_id, $personal_activity_id, $topn), 'team' => [], ); break; } return $return; } }