| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- <?php
- namespace addons\Pk\common\models;
- use addons\Pk\common\enums\PkEnum;
- use common\enums\StatusEnum;
- use common\models\user\User;
- use Yii;
- /**
- * This is the model class for table "{{%addons_pk_date_statistic}}".
- *
- * @property int $id
- * @property int $mall_id
- * @property int $status 状态[1启用 0禁用 -1删除]
- * @property int $join_user_num 参与活动人数
- * @property int $new_user_num 拉新人数
- * @property int $activity_num 新增活动数量
- * @property float $order_money_num 业绩总额
- * @property int $share_num 分享次数
- * @property int $share_visit 分享访问次数
- * @property string $date 日期(格式是:2020-06-01)
- * @property int $created_at 创建时间
- * @property int $updated_at 修改时间
- */
- class PkDateStatistic extends \common\models\base\BaseActiveRecord
- {
- /**
- * {@inheritdoc}
- */
- public static function tableName()
- {
- return '{{%addons_pk_date_statistic}}';
- }
- /**
- * {@inheritdoc}
- */
- public function rules()
- {
- return [
- [['mall_id', 'status', 'join_user_num', 'new_user_num', 'activity_num', 'share_num', 'share_visit', 'created_at', 'updated_at'], 'integer'],
- [['order_money_num'], 'number'],
- [['date'], 'required'],
- [['date'], 'safe'],
- ];
- }
- /**
- * {@inheritdoc}
- */
- public function attributeLabels()
- {
- return [
- 'id' => '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;
- }
- }
|