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; }
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'); }
/** * 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; }
/** * 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; }
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]; }
/** * @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; }