public function perform()
 {
     $args = $this->args;
     if (empty($args['accountId']) || empty($args['key']) || empty($args['header']) || empty($args['smsName'])) {
         ResqueUtil::log(['status' => 'fail to export early bird sms details', 'message' => 'missing params', 'args' => $args]);
         return false;
     }
     $accountId = new \MongoId($args['accountId']);
     $header = $args['header'];
     $fileName = $args['key'];
     $filePath = ExcelUtil::getFile($fileName, 'csv');
     $rows = null;
     if ($args['smsName'] == 'sms_four') {
         $rows = EarlyBirdSmsDetail::preProcessEarlyBirdSmsDetails($args['smsName'], $accountId);
     } else {
         $rows = EarlyBirdSmsFailed::preProcessSendFailedData($args['smsName'], $accountId);
     }
     ExcelUtil::exportCsv($header, $rows, $filePath, 1);
     $hashKey = ExcelUtil::setQiniuKey($filePath, $fileName);
     if ($hashKey) {
         //notice frontend the job is finished
         Yii::$app->tuisongbao->triggerEvent(Message::EVENT_EXPORT_FINISH, ['key' => $fileName], [Message::CHANNEL_GLOBAL . $args['accountId']]);
         return true;
     } else {
         ResqueUtil::log(['status' => 'fail to export early bird sms details', 'message' => 'fail to setQiniuKey', 'filePath' => $filePath]);
         return false;
     }
 }
 public static function preProcessSendFailedData($smsName, $accountId)
 {
     $query = new Query();
     $query = $query->from('uhkklpEarlyBirdSmsRecord')->select(['_id', 'failed']);
     $record = $query->where(['smsName' => $smsName, 'accountId' => $accountId])->orderBy(['createdAt' => SORT_DESC])->one();
     $rows = array();
     if ($record['failed'] > 0) {
         $failedAll = EarlyBirdSmsFailed::find()->where(['smsRecordId' => $record['_id']])->orderBy(['createdAt' => SORT_ASC])->all();
         foreach ($failedAll as $smsFailed) {
             $createdAt = MongodbUtil::MongoDate2String($smsFailed->createdAt, 'Y-m-d H:i:s', null);
             $row = ['createdAt' => $createdAt, 'mobile' => "'" . $smsFailed->mobile, 'smsContent' => $smsFailed->smsContent, 'status' => '失敗'];
             $rows[] = $row;
             unset($createdAt, $row);
         }
     }
     return $rows;
 }
 private static function _sendSms($members, $smsTag, $smsRecordId, $accountId)
 {
     try {
         if (!empty($members) && count($members) > 0) {
             for ($i = 0; $i < count($members); $i++) {
                 $member = $members[$i];
                 $sms = self::getSms($member, $smsTag, $accountId);
                 if (!empty($sms) && !empty($sms['mobile'])) {
                     $response = MessageUtil::sendMobileMessage($sms['mobile'], $sms['smsContent'], $accountId);
                     EarlyBirdSmsDetail::createSmsDetail($sms['mobile'], $sms['smsContent'], $response, $smsRecordId, $accountId);
                     if (!$response) {
                         LogUtil::error(['message' => 'EarlyBirdSms發送失敗', 'mobile' => $sms['mobile'], 'name' => $sms['name']], 'earlybird');
                         EarlyBirdSmsFailed::createSmsFailed($sms['mobile'], $sms['smsContent'], $smsRecordId, $accountId);
                     }
                     unset($sms, $member, $response);
                 }
             }
         }
         return true;
     } catch (\Exception $e) {
         LogUtil::error(['message' => 'EarlyBirdSms發送失敗', 'error' => $e], 'earlybird');
         EarlyBirdSmsRecord::updateProcessById($smsRecordId, 3);
         // 發送故障
         throw $e;
     }
 }