public function actionSignupSummary() { $params = $this->getQuery(); if (!isset($params['start']) || !isset($params['end'])) { throw new BadRequestHttpException(Yii::t('common', 'parameters_missing')); } if ($params['start'] > $params['end']) { throw new BadRequestHttpException(Yii::t('common', 'data_error')); } $accountId = $this->getAccountId(); $startDate = TimeUtil::msTime2String($params['start'], 'Y-m'); $endDate = TimeUtil::msTime2String($params['end'], 'Y-m'); $statsData = StatsMemberMonthly::getByDate($startDate, $endDate, $accountId); $data = []; foreach ($statsData as $item) { $date = $item->month; $data[$item->origin][$date] = empty($data[$item->origin][$date]) ? 0 : $data[$item->origin][$date]; $data[$item->origin][$date] += $item->total; } //ensure origins $channelOrigins = Channel::getOriginsByAccount($accountId); $origins = array_merge(StatsMemberMonthly::$originWithoutChannels, $channelOrigins); foreach ($origins as $origin) { if (empty($data[$origin])) { $data[$origin] = []; } } $endTime = strtotime($endDate); $dates = []; $totals = []; $dateTime = strtotime($startDate); while ($dateTime <= $endTime) { $date = date('Y-m', $dateTime); $dates[] = $date; foreach ($data as $origin => $dateTotal) { $totals[$origin][] = empty($dateTotal[$date]) ? 0 : $dateTotal[$date]; } $dateTime = strtotime('+1 month', $dateTime); } return ['date' => $dates, 'data' => $totals]; }
public static function preProcessData($condition) { $stats = self::findAll($condition); $statsData = []; foreach ($stats as $item) { $date = $item->month; $statsData[$item->origin][$date] = empty($statsData[$item->origin][$date]) ? 0 : $statsData[$item->origin][$date]; $statsData[$item->origin][$date] += $item->total; } //ensure origins $channelOrigins = Channel::getOriginsByAccount($condition['accountId']); $origins = array_merge(StatsMemberMonthly::$originWithoutChannels, $channelOrigins); foreach ($origins as $origin) { if (empty($statsData[$origin])) { $statsData[$origin] = []; } } $endDate = $condition['month']['$lte']; $startDate = $condition['month']['$gte']; $endTime = strtotime($endDate); $dateTime = strtotime($startDate); $data = []; while ($dateTime <= $endTime) { $date = date('Y-m', $dateTime); foreach ($statsData as $origin => $dateTotal) { $data[] = ['month' => $date, 'channel' => Yii::t('common', $origin), 'number' => empty($dateTotal[$date]) ? 0 : $dateTotal[$date]]; } $dateTime = strtotime('+1 month', $dateTime); } return $data; }