/**
  * Return question daily stats
  * @param string $id, questionnaireId
  */
 public function actionView($id)
 {
     $params = $this->getQuery();
     if (!isset($params['startTime']) || !isset($params['endTime'])) {
         throw new BadRequestHttpException(Yii::t('common', 'parameters_missing'));
     }
     if ($params['startTime'] > $params['endTime']) {
         throw new BadRequestHttpException(Yii::t('common', 'data_error'));
     }
     //turn unix timestamp to string
     $startDateStr = TimeUtil::msTime2String($params['startTime'], 'Y-m-d');
     $endDateStr = TimeUtil::msTime2String($params['endTime'], 'Y-m-d');
     $stats = StatsQuestionnaireDaily::getByQuestionnaireIdAndDate(new \MongoId($id), $startDateStr, $endDateStr);
     $statsMap = ArrayHelper::map($stats, 'date', 'count');
     //format result
     $dates = [];
     $counts = [];
     $dateTime = strtotime($startDateStr);
     $endTime = strtotime($endDateStr);
     while ($dateTime <= $endTime) {
         $date = date('Y-m-d', $dateTime);
         $dates[] = $date;
         $counts[] = empty($statsMap[$date]) ? 0 : $statsMap[$date];
         $dateTime = strtotime('+1 day', $dateTime);
     }
     return ['date' => $dates, 'count' => $counts];
 }
 /**
  * @args {"description": "Delay: Stats of questionnaire"}
  */
 public function perform()
 {
     $args = $this->args;
     //Get date from args or today
     $date = empty($args['date']) ? '' : $args['date'];
     $datetime = TimeUtil::getDatetime($date);
     $dateStr = date('Y-m-d', $datetime);
     $stats = QuestionnaireLog::getStats($dateStr);
     $statsRows = [];
     foreach ($stats as $stat) {
         $questionnaireId = $stat['_id']['questionnaireId'];
         $accountId = $stat['_id']['accountId'];
         //if $dailyStats exists, update it; else , create
         $dailyStats = ModelStatsQuestionnaireDaily::getByQuestionnaireAndDate($accountId, $questionnaireId, $dateStr);
         if (empty($dailyStats)) {
             $statsRows[] = ['accountId' => $accountId, 'questionnaireId' => $questionnaireId, 'date' => $dateStr, 'count' => $stat['count']];
         } else {
             $dailyStats->count = $stat['count'];
             //catch exception to avoid block batch insert
             try {
                 $dailyStats->save(true, ['count']);
             } catch (Exception $e) {
                 LogUtil::error(['Update StatsQuestionnaireDaily error' => $e->getMessage(), 'StatsQuestionnaireDaily' => $dailyStats]);
                 continue;
             }
         }
     }
     ModelStatsQuestionnaireDaily::batchInsert($statsRows);
     return true;
 }