Esempio n. 1
0
 public function perform()
 {
     $args = $this->args;
     if (empty($args['mainMember']) || empty($args['otherMemberIds'])) {
         ResqueUtil::log(['Merge member args error' => $args]);
         return;
     }
     $mainMember = unserialize($args['mainMember']);
     $otherMemberIds = unserialize($args['otherMemberIds']);
     //Get Name and phone
     $name = $phone = '';
     foreach ($mainMember->properties as $mainProperty) {
         if ($mainProperty['name'] === Member::DEFAULT_PROPERTIES_NAME) {
             $name = $mainProperty['value'];
         }
         if ($mainProperty['name'] === Member::DEFAULT_PROPERTIES_MOBILE) {
             $phone = $mainProperty['value'];
         }
     }
     ScoreHistory::updateAll(['$set' => ['memberId' => $mainMember->_id]], ['memberId' => ['$in' => $otherMemberIds]]);
     MemberLogs::deleteAll(['memberId' => ['$in' => $otherMemberIds]]);
     CampaignLog::updateAll(['$set' => ['member.id' => $mainMember->_id, 'member.cardNumber' => $mainMember->cardNumber, 'member.name' => $name, 'member.phone' => $phone]], ['member.id' => ['$in' => $otherMemberIds]]);
     PromotionCode::updateAll(['$set' => ['usedBy.memberId' => $mainMember->_id, 'usedBy.memberNumber' => $mainMember->cardNumber]], ['usedBy.memberId' => ['$in' => $otherMemberIds]]);
     GoodsExchangeLog::updateAll(['$set' => ['memberId' => $mainMember->_id, 'memberName' => $name, 'telephone' => $phone]], ['memberId' => ['$in' => $otherMemberIds]]);
     $otherMemberStrIds = [];
     foreach ($otherMemberIds as $otherMemberId) {
         $otherMemberStrIds[] = (string) $otherMemberId;
     }
     Order::updateAll(['$set' => ['consumer.id' => (string) $mainMember->_id, 'consumer.name' => $name, 'consumer.phone' => $phone]], ['consumer.id' => ['$in' => $otherMemberStrIds]]);
     Qrcode::deleteAll(['type' => Qrcode::TYPE_MEMBER, 'associatedId' => ['$in' => $otherMemberIds]]);
 }
 public function perform()
 {
     $args = $this->args;
     if (empty($args['header']) || empty($args['key']) || empty($args['accountId']) || empty($args['condition'])) {
         ResqueUtil::log(['status' => 'fail to export code', 'message' => 'missing params', 'args' => $args]);
         return false;
     }
     $header = $args['header'];
     //set the language
     Yii::$app->language = empty($args['language']) ? LanguageUtil::DEFAULT_LANGUAGE : $args['language'];
     $fileName = $args['key'];
     $filePath = ExcelUtil::getFile($fileName, 'csv');
     $condition = unserialize($args['condition']);
     $object = CampaignLog::find();
     $classFunction = '\\backend\\modules\\product\\models\\CampaignLog::preProcessRedeemedCodeData';
     ExcelUtil::processMultiData($header, $filePath, [], $condition, $object, $classFunction, ['changeTostring' => []]);
     $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 {
         return false;
     }
 }
 public function actionIndex($accountId)
 {
     if (empty($accountId)) {
         echo 'accountId is invaild' . PHP_EOL;
         exit;
     }
     $where['accountId'] = new \MongoId($accountId);
     // delete member info
     Member::getCollection()->remove($where);
     //delete MemberLogs
     MemberLogs::getCollection()->remove($where);
     //delete scoreHistory
     ScoreHistory::getCollection()->remove($where);
     //delete CampaignLog
     CampaignLog::getCollection()->remove($where);
     //delete GoodsExchangeLog
     GoodsExchangeLog::getCollection()->remove($where);
     //delete MemberStatistics
     MemberStatistics::getCollection()->remove($where);
     //delete ReMemberCampaign
     ReMemberCampaign::getCollection()->remove($where);
     //delete StatsCampaignProductCodeQuarterly
     StatsCampaignProductCodeQuarterly::getCollection()->remove($where);
     //delete StatsMemberCampaignLogDaily
     StatsMemberCampaignLogDaily::getCollection()->remove($where);
     //delete StatsMemberDaily
     StatsMemberDaily::getCollection()->remove($where);
     //delete StatsMemberGrowthMonthly
     StatsMemberGrowthMonthly::getCollection()->remove($where);
     //delete StatsMemberGrowthQuarterly
     StatsMemberGrowthQuarterly::getCollection()->remove($where);
     //delete StatsMemberMonthly
     StatsMemberMonthly::getCollection()->remove($where);
     //delete StatsMemberPropAvgTradeQuarterly
     StatsMemberPropAvgTradeQuarterly::getCollection()->remove($where);
     //delete StatsMemberPropMonthly
     StatsMemberPropMonthly::getCollection()->remove($where);
     //delete StatsMemberPropQuaterly
     StatsMemberPropQuaterly::getCollection()->remove($where);
     //delete StatsMemberPropTradeCodeAvgQuarterly
     StatsMemberPropTradeCodeAvgQuarterly::getCollection()->remove($where);
     //delete StatsMemberPropTradeCodeQuarterly
     StatsMemberPropTradeCodeQuarterly::getCollection()->remove($where);
     //delete StatsMemberPropTradeQuarterly
     StatsMemberPropTradeQuarterly::getCollection()->remove($where);
     //delete PromotionCodeAnalysis
     PromotionCodeAnalysis::getCollection()->remove($where);
     //delete order
     Order::getCollection()->remove($where);
     //delete stats member order
     StatsMemberOrder::getCollection()->remove($where);
     //delete stats order
     StatsOrder::getCollection()->remove($where);
     //delete MembershipDiscount
     MembershipDiscount::getCollection()->remove($where);
     //delete couponLog
     CouponLog::getCollection()->remove($where);
     echo 'delete data successful.' . PHP_EOL;
 }
 public function actionFixData($startData, $endData)
 {
     $accounts = Account::findAll(['enabledMods' => 'product']);
     foreach ($accounts as $account) {
         $accountId = $account->_id;
         $condition = ['accountId' => $accountId, 'createdAt' => ['$gte' => new MongoDate(strtotime($startData)), '$lt' => new Mongodate(strtotime($endData))]];
         $pipeline = [['$match' => $condition], ['$group' => ['_id' => ['campaignId' => '$campaignId', 'code' => '$code'], 'count' => ['$sum' => 1]]], ['$match' => ['count' => ['$gt' => 1]]]];
         $stats = CampaignLog::getCollection()->aggregate($pipeline);
         if (!empty($stats)) {
             foreach ($stats as $stat) {
                 $code = $stat['_id']['code'];
                 $logCondition = array_merge($condition, $stat['_id']);
                 $logs = CampaignLog::find()->where($logCondition)->orderBy(['createdAt' => 1])->all();
                 $memberId = $logs[0]['member']['id'];
                 $productName = $logs[0]['productName'];
                 $description = $productName . ' ' . $code;
                 $scoreHistoryCondition = ['memberId' => $memberId, 'brief' => ScoreHistory::ASSIGNER_EXCHANGE_PROMOTION_CODE, 'description' => $description];
                 $scoreHistorys = ScoreHistory::find()->where($scoreHistoryCondition)->orderBy(['createdAt' => 1])->all();
                 $keepScoreHistory = $scoreHistorys[0];
                 unset($scoreHistorys[0]);
                 $removeScoreHistoryIds = [];
                 $deduct = 0;
                 foreach ($scoreHistorys as $scoreHistory) {
                     $removeScoreHistoryIds[] = $scoreHistory->_id;
                     $deduct += $scoreHistory->increment;
                 }
                 $member = Member::findByPk($memberId);
                 if ($member->score <= $deduct || $member->totalScore <= $deduct || $member->totalScoreAfterZeroed <= $deduct) {
                     echo 'Failed : Member' . $memberId . ' score not enough ' . 'score: ' . $member->score;
                     echo ' totalScore: ' . $member->totalScore;
                     echo ' totalScoreAfterZeroed: ' . $member->totalScoreAfterZeroed . PHP_EOL;
                     continue;
                 }
                 $deductScore = 0 - $deduct;
                 Member::updateAll(['$inc' => ['score' => $deductScore, 'totalScore' => $deductScore, 'totalScoreAfterZeroed' => $deductScore]], ['_id' => $memberId]);
                 ScoreHistory::deleteAll(['_id' => ['$in' => $removeScoreHistoryIds]]);
                 $logIds = ArrayHelper::getColumn($logs, '_id');
                 $keepLogId = $logIds[0];
                 unset($logIds[0]);
                 CampaignLog::deleteAll(['_id' => ['$in' => array_values($logIds)]]);
                 echo 'Success: ' . $productName . ' ' . $code . ' ' . $stat['count'];
                 echo ' Deduct member ' . $memberId . ' score ' . $deduct . PHP_EOL;
             }
         }
     }
     echo 'Success' . PHP_EOL;
 }
 /**
  * @args {"description": "Direct: Analysis participate promotion code "}
  */
 public function perform()
 {
     $yesterday = ModelPromotionCodeAnalysis::getTime(-1);
     $type = new MongoInt32(ModelPromotionCodeAnalysis::PROMOTION_CODE_ANALYSIS_PARTICIPATE);
     $where = ['createdAt' => $yesterday, 'type' => $type];
     $status = ModelPromotionCodeAnalysis::checkExistData($where);
     if ($status) {
         $yesterdayStamp = TimeUtil::today() - 24 * 3600;
         $yesterday = new MongoDate($yesterdayStamp);
         $createWhere = ModelPromotionCodeAnalysis::getCreateTime();
         $campaignIds = CampaignLog::distinct('campaignId', $createWhere);
         $campaignLogs = [];
         if (!empty($campaignIds)) {
             $where = array_merge($createWhere, ['campaignId' => ['$in' => $campaignIds]]);
             $campaignLogs = CampaignLog::getCollection()->aggregate([['$match' => $where], ['$group' => ['_id' => ['campaignId' => '$campaignId', 'memberId' => '$member.id', 'accountId' => '$accountId', 'productId' => '$productId']]]]);
         }
         if (!empty($campaignLogs)) {
             //get total for take part in a campaign
             $campaignData = [];
             foreach ($campaignLogs as $data) {
                 $campaignId = $data['_id']['campaignId'];
                 $key = (string) $campaignId . (string) $data['_id']['productId'];
                 if (isset($campaignData[$key])) {
                     //to sum the total in every product in same campaign
                     $campaignData[$key]['total'] += 1;
                 } else {
                     $product = Product::findByPk($data['_id']['productId']);
                     $productName = empty($product['name']) ? '' : $product['name'];
                     $result = ['productId' => $data['_id']['productId'], 'productName' => $productName, 'campaignId' => $campaignId, 'accountId' => $data['_id']['accountId'], 'createdAt' => $yesterday, 'total' => 1, 'type' => $type];
                     $campaignData[$key] = $result;
                 }
             }
             if (false === ModelPromotionCodeAnalysis::batchInsert($campaignData)) {
                 LogUtil::error(['message' => 'Faild to create daily data', 'date' => date('Y-m-d H:i:s'), 'data' => json_encode($campaignData)], 'resque');
             }
             unset($datas, $campaignIds, $campaignData);
         }
     } else {
         LogUtil::info(['message' => 'Participate analysis data is exists', 'date' => date('Y-m-d H:i:s')], 'resque');
     }
     return true;
 }
 /**
  * export the promotioncode has been redeemed
  */
 public function actionExport()
 {
     $accountId = $this->getAccountId();
     $params = $this->getQuery();
     $where = CampaignLog::createCondition($params, $accountId);
     $data = CampaignLog::find()->where($where)->one();
     if ($data) {
         //redis hash key and set a default value
         $key = Yii::t('product', 'file_name') . '_' . date('YmdHis');
         // get the header for the excel
         $headerValues = explode(",", Yii::t('product', 'promotion_redeemed_export'));
         $headerKeys = ['id', 'cardNumber', 'memberName', 'tel', 'sku', 'productName', 'code', 'prize', 'redeemTime', 'createdAt', 'redeemptionChannelName', 'campaignName', 'backendUser'];
         $header = array_combine($headerKeys, $headerValues);
         $exportArgs = ['collection' => 'campaignLog', 'classFunction' => '\\backend\\modules\\product\\models\\CampaignLog::preProcessRedeemedCodeData', 'sort' => ['createdAt' => -1], 'language' => Yii::$app->language, 'header' => $header, 'key' => $key, 'params' => [], 'fields' => '_id,code,productId,productName,campaignName,sku,operaterEmail,member,redeemTime,usedFrom,createdAt', 'accountId' => (string) $accountId, 'condition' => serialize(CampaignLog::getCollection()->buildCondition($where)), 'description' => 'Direct: export promotionCodes that is been redeemed'];
         $jobId = Yii::$app->job->create('backend\\modules\\common\\job\\MongoExportFile', $exportArgs);
         $result = ['result' => 'success', 'message' => 'exporting redeemed code', 'data' => ['jobId' => $jobId, 'key' => $key]];
     } else {
         $result = ['result' => 'error', 'message' => 'no datas', 'data' => []];
     }
     return $result;
 }
 public function actionIndex()
 {
     $offset = 0;
     $query = CampaignLog::find();
     $order = ['_id' => SORT_ASC];
     $campaignLogs = $query->orderBy($order)->offset($offset)->limit(static::BATCH_ROWS)->all();
     while (!empty($campaignLogs)) {
         foreach ($campaignLogs as $campaignLog) {
             if (empty($campaignLog->redeemTime)) {
                 if (!empty($campaignLog->usedTime)) {
                     $campaignLog->redeemTime = $campaignLog->usedTime;
                 } else {
                     $campaignLog->redeemTime = $campaignLog->createdAt;
                 }
                 $campaignLog->save();
             }
         }
         unset($campaignLog, $campaignLogs);
         $offset += static::BATCH_ROWS;
         $campaignLogs = $query->offset($offset)->limit(static::BATCH_ROWS)->all();
     }
     echo 'update data successful' . PHP_EOL;
 }
Esempio n. 8
0
 private function _memberLogsFromCampaign($accountId)
 {
     $skip = 0;
     $limit = 100;
     $query = CampaignLog::find()->where(['accountId' => $accountId])->orderBy(['createdAt' => SORT_ASC]);
     $query = $query->offset($skip)->limit($limit);
     $campaignLogs = $query->all();
     while (!empty($campaignLogs)) {
         $memberLogs = [];
         foreach ($campaignLogs as $campaignLog) {
             $member = $campaignLog->member;
             $memberLogs[] = ['memberId' => $member['id'], 'operation' => MemberLogs::OPERATION_REDEEM, 'operationAt' => empty($campaignLog->redeemTime) ? $campaignLog->createdAt : $campaignLog->redeemTime, 'createdAt' => $campaignLog->createdAt, 'accountId' => $campaignLog->accountId];
         }
         MemberLogs::batchInsert($memberLogs);
         $skip += $limit;
         $query = $query->offset($skip)->limit($limit);
         $campaignLogs = $query->all();
     }
 }
 /**
  * This function is just for fix error promotionCode redeem data
  * @param MongoId $accountId
  * @param MongoId $memberId
  * @param Array $codes
  * @return boolean, true, if there is no error data
  */
 private function fixData($accountId, $memberId, $codes)
 {
     $condition = ['accountId' => $accountId, 'member.id' => $memberId, 'code' => ['$in' => $codes]];
     $pipeline = [['$match' => $condition], ['$group' => ['_id' => ['campaignId' => '$campaignId', 'code' => '$code'], 'count' => ['$sum' => 1]]], ['$match' => ['count' => ['$gt' => 1]]]];
     $stats = CampaignLog::getCollection()->aggregate($pipeline);
     if (empty($stats)) {
         return true;
     }
     $logCondition = ['accountId' => $accountId, 'member.id' => $memberId];
     $failedMessages = [];
     $successMessages = [];
     foreach ($stats as $stat) {
         $code = $stat['_id']['code'];
         //get campaign log
         $logCondition = array_merge($logCondition, $stat['_id']);
         $logs = CampaignLog::find()->where($logCondition)->orderBy(['createdAt' => SORT_ASC])->all();
         $memberId = $logs[0]['member']['id'];
         $productName = $logs[0]['productName'];
         //get score history
         $description = $productName . ' ' . $code;
         $scoreHistoryCondition = ['memberId' => $memberId, 'brief' => ScoreHistory::ASSIGNER_EXCHANGE_PROMOTION_CODE, 'description' => $description];
         $scoreHistorys = ScoreHistory::find()->where($scoreHistoryCondition)->orderBy(['createdAt' => SORT_ASC])->all();
         $keepScoreHistory = $scoreHistorys[0];
         unset($scoreHistorys[0]);
         $removeScoreHistoryIds = [];
         $deduct = 0;
         foreach ($scoreHistorys as $scoreHistory) {
             $removeScoreHistoryIds[] = $scoreHistory->_id;
             $deduct += $scoreHistory->increment;
         }
         $member = Member::findByPk($memberId);
         //if member score not enough, log continue
         if ($member->score <= $deduct || $member->totalScore <= $deduct || $member->totalScoreAfterZeroed <= $deduct) {
             $failedMessages[] = ['Failed' => 'Member score not enough', 'member' => $member->toArray(), 'deduct' => $deduct];
             continue;
         }
         //fix member score
         $deductScore = 0 - $deduct;
         Member::updateAll(['$inc' => ['score' => $deductScore, 'totalScore' => $deductScore, 'totalScoreAfterZeroed' => $deductScore]], ['_id' => $memberId]);
         //remove scorehistory
         ScoreHistory::deleteAll(['_id' => ['$in' => $removeScoreHistoryIds]]);
         //remove campaignlog
         $logIds = ArrayHelper::getColumn($logs, '_id');
         $keepLogId = $logIds[0];
         unset($logIds[0]);
         CampaignLog::deleteAll(['_id' => ['$in' => array_values($logIds)]]);
         $successMessages[] = ['Success' => $productName . ' ' . $code . ' ' . $stat['count'], 'memberId' => $memberId, 'deduct' => $deduct];
     }
     LogUtil::error(['Failed' => $failedMessages, 'Success' => $successMessages], 'fix-campaign-data');
 }
Esempio n. 10
0
 /**
  * record campaign log
  * @return object, campaign log object
  */
 public static function setCampaignLog($scoreAdded, $params, $member, $campaign, $productInfo, $channelInfo)
 {
     //record a log
     $data = ['accountId' => $member->accountId, 'code' => $params['code'], 'productId' => $params['productId'], 'productName' => $productInfo->name, 'campaignName' => $campaign->name, 'sku' => $productInfo->sku, 'operaterEmail' => !empty($params['operaterEmail']) ? $params['operaterEmail'] : ''];
     $properties = $member->properties;
     $name = $phone = '';
     foreach ($properties as $property) {
         if ('name' == $property['name']) {
             $name = $property['value'];
         } else {
             if ('tel' == $property['name']) {
                 $phone = $property['value'];
             }
         }
     }
     //get the type of promocode and the name of prize
     $type = $prize = '';
     if (!empty($campaign->promotion['gift'])) {
         $gift = $campaign->promotion['gift'];
         $type = $gift['type'];
         //get the name of prize TODO
     }
     $data['member'] = ['id' => $params['memberId'], 'cardNumber' => $member->cardNumber, 'scoreAdded' => intval($scoreAdded), 'score' => $member->score, 'name' => $name, 'phone' => $phone, 'type' => $type, 'prize' => $prize];
     //add a field to show the member when to exchage code
     $data['redeemTime'] = new MongoDate();
     if (!empty($params['exchangeTime'])) {
         $data['redeemTime'] = new MongoDate($params['exchangeTime']);
     }
     $data['usedFrom'] = ['id' => isset($params['channelId']) ? $params['channelId'] : '', 'name' => $channelInfo['channelName'], 'type' => $channelInfo['channelType']];
     $data['campaignId'] = $campaign->_id;
     $campaignLog = new CampaignLog();
     $campaignLog->load($data, '');
     if (false === $campaignLog->save()) {
         LogUtil::error(['message' => 'fail to record log', 'params' => $params, 'member' => $member, 'campaign' => $campaign], self::PROMOTION_LOG);
     }
     return $campaignLog;
 }
 private static function _getCampaignLogs($productIds, $createWhere)
 {
     $campaignLogs = [];
     if (!empty($productIds)) {
         $where = array_merge($createWhere, ['productId' => ['$in' => $productIds]]);
         $campaignLogs = CampaignLog::getCollection()->aggregate([['$match' => $where], ['$group' => ['_id' => ['productId' => '$productId', 'productName' => '$productName', 'memberId' => '$member.id', 'accountId' => '$accountId']]]]);
     }
     return $campaignLogs;
 }
Esempio n. 12
0
 /**
  * get how many code to  exchange and how many scords to redeem
  * @param $codes
  */
 public static function getCodeRecord($codes)
 {
     if (!is_array($codes)) {
         $codes = explode(',', $codes);
     }
     $where = ['code' => ['$in' => $codes], 'member.type' => self::CAMPAIGN_SCORE];
     LogUtil::info(['msg' => 'get code and score', 'where' => $where], 'campaignLog');
     $results = CampaignLog::getCollection()->aggregate([['$match' => $where], ['$group' => ['_id' => '$code', 'score' => ['$sum' => '$member.scoreAdded']]]]);
     LogUtil::info(['msg' => 'get struct', 'results' => $results], 'campaignLog');
     $codeCount = $scoreCount = 0;
     if (!empty($results)) {
         $codeCount = count($results);
         foreach ($results as $result) {
             $scoreCount += $result['score'];
         }
     }
     return [$codeCount, $scoreCount];
 }
 /**
  * get the number of member who do not take part in this campaign before
  * @param $condition,array
  * @param $create,array
  */
 public static function checkMemberUnique($condition, $create)
 {
     $where = ['createdAt' => ['$gte' => new MongoDate($create - 24 * 3600), '$lt' => new MongoDate($create)]];
     $where = array_merge($where, $condition);
     $members = CampaignLog::distinct('member.id', $where);
     //set default value
     $number = count($members);
     if (!empty($members)) {
         $where['createdAt'] = ['$lt' => new MongoDate($create - 24 * 3600)];
         $where['member.id'] = ['$in' => $members];
         $members = CampaignLog::distinct('member.id', $where);
         $number -= count($members);
     }
     return $number;
 }
 public function perform()
 {
     $args = $this->args;
     if (empty($args['beginTime']) || empty($args['endTime']) || empty($args['type'])) {
         ResqueUtil::log(['error' => 'missing params', 'args' => $args]);
         return false;
     }
     $beginTime = strtotime($args['beginTime']) + 3600 * 24;
     $endTime = strtotime($args['endTime']);
     if ($endTime > time()) {
         $endTime = strtotime(date('Y-m-d', time()));
     }
     $endTime += 3600 * 24;
     $type = new \MongoInt32($args['type']);
     switch ($args['type']) {
         case PromotionCodeAnalysis::PROMOTION_CODE_ANALYSIS_PARTICIPATE:
             //delete data and create data
             for ($t = $beginTime; $t <= $endTime; $t += 3600 * 24) {
                 $where = ['createdAt' => new \MongoDate($t - 3600 * 24), 'type' => $type];
                 PromotionCodeAnalysis::deleteAll($where);
                 //create data begin
                 $createWhere = PromotionCodeAnalysis::getCreateTime($t);
                 $campaignIds = CampaignLog::distinct('campaignId', $createWhere);
                 $campaignLogs = [];
                 if (!empty($campaignIds)) {
                     $where = array_merge($createWhere, ['campaignId' => ['$in' => $campaignIds]]);
                     $campaignLogs = CampaignLog::getCollection()->aggregate([['$match' => $where], ['$group' => ['_id' => ['campaignId' => '$campaignId', 'accountId' => '$accountId', 'productId' => '$productId', 'memberId' => '$member.id']]]]);
                 }
                 if (!empty($campaignLogs)) {
                     //get total for take part in a campaign
                     $campaignData = [];
                     foreach ($campaignLogs as $data) {
                         $campaignId = $data['_id']['campaignId'];
                         $key = (string) $campaignId . (string) $data['_id']['productId'];
                         if (isset($campaignData[$key])) {
                             //to sum the total in every product in same campaign
                             $campaignData[$key]['total'] += 1;
                         } else {
                             $product = Product::findByPk($data['_id']['productId']);
                             $productName = empty($product['name']) ? '' : $product['name'];
                             $result = ['productId' => $data['_id']['productId'], 'productName' => $productName, 'campaignId' => $campaignId, 'accountId' => $data['_id']['accountId'], 'createdAt' => new \MongoDate($t - 3600 * 24), 'total' => 1, 'type' => $type];
                             $campaignData[$key] = $result;
                         }
                     }
                     PromotionCodeAnalysis::batchInsert($campaignData);
                     unset($datas, $campaignIds, $campaignData);
                 }
             }
             break;
         case PromotionCodeAnalysis::PROMOTION_CODE_ANALYSIS_TOTAL:
             //delete data and create data
             for ($t = $beginTime; $t <= $endTime; $t += 3600 * 24) {
                 $where = ['createdAt' => new \MongoDate($t - 3600 * 24), 'type' => $type];
                 PromotionCodeAnalysis::deleteAll($where);
                 //get campaignlogs in yesterday
                 $campaignLogs = PromotionCodeAnalysis::getMemberCampaignLog(false, $t);
                 //create datas
                 $yesterday = new \MongoDate($t - 2 * 24 * 3600);
                 if (!empty($campaignLogs)) {
                     $campaignData = [];
                     foreach ($campaignLogs as $key => $campaignLog) {
                         //get total the day yesterday
                         $productId = $campaignLog['_id']['productId'];
                         $campaignId = $campaignLog['_id']['campaignId'];
                         $accountId = $campaignLog['_id']['accountId'];
                         $condition = ['productId' => $productId, 'campaignId' => $campaignId, 'accountId' => $accountId, 'createdAt' => $yesterday, 'type' => $type];
                         $yesterdayData = PromotionCodeAnalysis::findOne($condition);
                         if (empty($yesterdayData)) {
                             $yesterdayData['total'] = 0;
                         }
                         $condition = ['campaignId' => $campaignId, 'accountId' => $accountId, 'productId' => $productId];
                         $number = PromotionCodeAnalysis::checkMemberUnique($condition, $t);
                         //subtract the member who is recorded before
                         $total = $yesterdayData['total'] + $number;
                         $campaignLogs[$key]['total'] = $total;
                     }
                     $campaignData = PromotionCodeAnalysis::createAnalysisData($campaignLogs, $type, new \MongoDate($t - 24 * 3600));
                     PromotionCodeAnalysis::batchInsert($campaignData);
                 }
                 //set the default value when the value is not exists
                 PromotionCodeAnalysis::setDefault($t - 2 * 24 * 3600, $type);
             }
             break;
         case PromotionCodeAnalysis::PROMOTION_CODE_ANALYSIS_EVERYDAY_PRIZE:
             for ($t = $beginTime; $t <= $endTime; $t += 3600 * 24) {
                 //delete data
                 $where = ['createdAt' => new \MongoDate($t - 3600 * 24), 'type' => $type];
                 PromotionCodeAnalysis::deleteAll($where);
                 $campaignLogs = PromotionCodeAnalysis::getCampaignLog(false, $t);
                 if (!empty($campaignLogs)) {
                     $campaignData = PromotionCodeAnalysis::createAnalysisData($campaignLogs, $type, new \MongoDate($t - 3600 * 24));
                     PromotionCodeAnalysis::batchInsert($campaignData);
                 }
             }
             break;
         case PromotionCodeAnalysis::PROMOTION_CODE_ANALYSIS_TOTAL_PARTICIPATE:
             for ($t = $beginTime; $t <= $endTime; $t += 3600 * 24) {
                 //delete data
                 $where = ['createdAt' => new \MongoDate($t - 3600 * 24), 'type' => $type];
                 PromotionCodeAnalysis::deleteAll($where);
                 unset($where);
                 $where = PromotionCodeAnalysis::getCreateTime($t);
                 $campaignLogs = PromotionCodeAnalysis::getMemberAllTimes($where);
                 if (!empty($campaignLogs)) {
                     $campaignData = PromotionCodeAnalysis::createAnalysisData($campaignLogs, $type, new \MongoDate($t - 3600 * 24));
                     PromotionCodeAnalysis::batchInsert($campaignData);
                 }
             }
             break;
     }
     return true;
 }
 public static function getMemberInfo($condition)
 {
     $memberIds = CampaignLog::distinct('member.id', $condition);
     $memberInfos = [];
     if (!empty($memberIds)) {
         $members = Member::findAll(['_id' => ['$in' => $memberIds]]);
         if (!empty($members)) {
             foreach ($members as $member) {
                 $memberInfos[(string) $member->_id] = $member;
             }
         }
         unset($member, $members);
     }
     return $memberInfos;
 }
 private static function _getCampaignLog($condition)
 {
     $campaignLogs = CampaignLog::getCollection()->aggregate(['$match' => $condition], ['$group' => ['_id' => ['productId' => '$productId', 'createdAt' => '$createdAt', 'member' => '$member', 'code' => '$code', 'redeemTime' => '$redeemTime']]]);
     return $campaignLogs;
 }
Esempio n. 17
0
 public function actionCnyPromotion()
 {
     $params = $this->getParams('data', null);
     $accountId = new \MongoId($params['account_id']);
     if (empty($params) || empty($params['member_id']) || empty($params['type']) || empty($params['score']) || empty($accountId)) {
         throw new BadRequestHttpException("params are missing.");
     }
     if ($params['type'] != 'promotion_code_redeemed') {
         Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
         return ['message' => 'Not promotion_code_redeemed'];
     }
     //get memberInfo
     $member = Member::findByPk(new \MongoId($params['member_id']));
     $memberInfo = ['addScore' => $params['score'], 'id' => new \MongoId($params['member_id']), 'score' => $member->score];
     if (!empty($member->properties)) {
         foreach ($member->properties as $propertie) {
             if ($propertie['name'] == 'name') {
                 $memberInfo['name'] = $propertie['value'];
             }
             if ($propertie['name'] == 'tel') {
                 $memberInfo['mobile'] = $propertie['value'];
             }
         }
     }
     unset($member, $params);
     // get CNY Info
     $activity = Activity::findOne(['name' => 'cny', 'accountId' => $accountId]);
     if (empty($activity)) {
         throw new ServerErrorHttpException("Get CNY information failed or No CNY");
     }
     $needPoints = $activity->luckyDrawInfo['needPoints'];
     $drawDates = $activity->luckyDrawInfo['drawDate'];
     $conditionForOdds = ['member.id' => $memberInfo['id'], 'redeemTime' => ['$gte' => $activity->startDate, '$lte' => $activity->endDate]];
     unset($activity);
     // get day
     // sort($drawDates);
     // $currentDate = new \mongoDate();
     // $targetDate = null;
     // $day = 0;
     // foreach ($drawDates as $drawDate) {
     //     if ($drawDate > $currentDate) {
     //         $targetDate = $drawDate;
     //         break;
     //     }
     // }
     // if (!empty($targetDate)) {
     //     $offsetTime = MongodbUtil::MongoDate2msTimeStamp($targetDate) - MongodbUtil::MongoDate2msTimeStamp($currentDate);
     //     $day = ceil($offsetTime / (1000 * 60 * 60 * 24));
     //     unset($drawDates, $currentDate, $targetDate);
     // }
     // get odds
     $oddsCount = 0;
     $checkDouble = [];
     $canDouble = false;
     $redeemRecords = CampaignLog::find()->where($conditionForOdds)->all();
     if (!empty($redeemRecords)) {
         foreach ($redeemRecords as $redeemRecord) {
             $product = $redeemRecord['productName'];
             $oddsCount += $redeemRecord['member']['scoreAdded'];
             if (!$canDouble) {
                 if ($product == '2015 雞粉2.2kg' || $product == '2015 雞粉1.1kg' || $product == '2016 康寶雞粉 1.1KG' || $product == '2016 康寶雞粉 2.2KG') {
                     $checkDouble['chickenPowder'] = true;
                 }
                 if ($product == '2015 鮮雞汁' || $product == '2016 康寶濃縮鮮雞汁') {
                     $checkDouble['chickenJuice'] = true;
                 }
                 if ($product == '2015 鰹魚粉1kg' || $product == '2015 鰹魚粉1.5kg' || $product == '2016 康寶鰹魚粉 1KG' || $product == '2016 康寶鰹魚粉 1.5KG') {
                     $checkDouble['fishmeal'] = true;
                 }
                 if (count($checkDouble) == 3) {
                     $canDouble = true;
                 }
             }
             unset($product);
         }
     }
     $oddsCount = intval($oddsCount / $needPoints);
     if ($canDouble) {
         $oddsCount = $oddsCount * 2;
     }
     unset($checkDouble, $canDouble, $needPoints, $redeemRecords, $conditionForOdds);
     //$memberInfo:id,name,mobile,addScore,score; $day; $oddsCount
     $mobile = BulkSmsUtil::processSmsMobile($accountId, $memberInfo['mobile']);
     $smsContent = null;
     $currentDate = MongodbUtil::MongoDate2msTimeStamp(new \mongoDate());
     $topPrizeDate = MongodbUtil::MongoDate2msTimeStamp(new \MongoDate(strtotime("2016-02-29 00:00:00")));
     $offsetDay = ceil(($topPrizeDate - $currentDate) / (1000 * 60 * 60 * 24));
     if ($offsetDay > 10) {
         // 還沒倒計時
         $smsContent = $memberInfo['name'] . '您好,您郵寄的點數已入點完成,此次共入點' . $memberInfo['addScore'] . '點,您目前點數為' . $memberInfo['score'] . '點。恭喜您同時累積活動『年年好味不能沒有你』' . $oddsCount . '次抽獎機會,累積點數越多,中獎機會越大,詳細活動辦法請見http://bit.ly/1P4yZEA';
     } elseif ($offsetDay > 3 && $offsetDay < 11) {
         $smsContent = $memberInfo['name'] . '您好,您郵寄的點數已入點完成,此次共入點' . $memberInfo['addScore'] . '點,您目前點數為' . $memberInfo['score'] . '點。恭喜您同時累積活動『年年好味不能沒有你』' . $oddsCount . '次抽獎機會,距離30萬元紅包抽獎,只剩' . $offsetDay . '天,詳細活動辦法請見http://bit.ly/1P4yZEA';
     } elseif ($offsetDay >= 0 && $offsetDay <= 3) {
         $smsContent = $memberInfo['name'] . '您好,您郵寄的點數已入點完成,此次共入點' . $memberInfo['addScore'] . '點,您目前點數為' . $memberInfo['score'] . '點。恭喜您同時累積活動『年年好味不能沒有你』' . $oddsCount . '次抽獎機會,距離30萬元紅包抽獎,倒數' . abs($offsetDay) . '天,詳細活動辦法請見http://bit.ly/1P4yZEA';
     }
     Smslog::createSmsLog($mobile, $smsContent, 'CNY webhook SMS', 'sending', $accountId);
     MessageUtil::sendMobileMessage($mobile, $smsContent, $accountId);
     Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
     return ['mobile' => $mobile, 'smsContent' => $smsContent];
 }
Esempio n. 18
0
 /**
  * @param $condition array eg: ['accountId'=>$accountId, 'redeemTime'=>['$gte'=>$startDate, '$lte'=>$endDate]];
  * @return $member array
  *     [
  *        [   "mobile" => '0933431025',
  *            "scoreAdded" => 30,
  *            "canDouble" => ture,
  *            "name": "用戶名1",
  *            "odds": 6
  *        ],
  *        [   "mobile" => '0912345678',
  *            "scoreAdded": 10,
  *            "canDouble" => false,
  *            "name": "用戶名2",
  *            "odds": 1
  *        ],
  *     ]
  */
 private function _getCanDrawMembers($condition, $pointsPerOdds)
 {
     $mobiles = CampaignLog::distinct('member.phone', $condition);
     $redeemRecords = CampaignLog::find()->where($condition)->all();
     $members = array();
     // mobile, scoreAdded, canDouble
     $mobilesCount = count($mobiles);
     for ($i = 0; $i < $mobilesCount; $i++) {
         $members[$i] = ['mobile' => $mobiles[$i], 'scoreAdded' => 0, 'canDouble' => false];
         $checkDouble = array();
         foreach ($redeemRecords as $redeemRecord) {
             $product = $redeemRecord['productName'];
             if ($mobiles[$i] == $redeemRecord['member']['phone']) {
                 $members[$i]['name'] = $redeemRecord['member']['name'];
                 if ($redeemRecord['member']['type'] == 'score') {
                     $members[$i]['scoreAdded'] += $redeemRecord['member']['scoreAdded'];
                 }
                 //判断是否购买全部3支品项
                 if (!$members[$i]['canDouble']) {
                     if ($product == '2015 雞粉2.2kg' || $product == '2015 雞粉1.1kg' || $product == '2016 康寶雞粉 1.1KG' || $product == '2016 康寶雞粉 2.2KG') {
                         $checkDouble['chickenPowder'] = true;
                     }
                     if ($product == '2015 鮮雞汁' || $product == '2016 康寶濃縮鮮雞汁') {
                         $checkDouble['chickenJuice'] = true;
                     }
                     if ($product == '2015 鰹魚粉1kg' || $product == '2015 鰹魚粉1.5kg' || $product == '2016 康寶鰹魚粉 1KG' || $product == '2016 康寶鰹魚粉 1.5KG') {
                         $checkDouble['fishmeal'] = true;
                     }
                     if (count($checkDouble) == 3) {
                         $members[$i]['canDouble'] = true;
                     }
                 }
             }
             unset($product);
         }
         unset($checkDouble);
     }
     unset($mobiles, $redeemRecords, $mobilesCount);
     foreach ($members as $key => $value) {
         if ($members[$key]['canDouble']) {
             $members[$key]['odds'] = intval($members[$key]['scoreAdded'] / $pointsPerOdds) * 2;
         } else {
             $members[$key]['odds'] = intval($members[$key]['scoreAdded'] / $pointsPerOdds);
         }
         // unset($members[$key]['canDouble']);
     }
     return $members;
 }