public static function generateData($accountId, $memberPropertyId, $year, $quarter, $propertyOperate)
 {
     $statsQuarterly = ModelStatsMemberCampaignLogDaily::getPropAvgTradeQuarterly($accountId, (string) $memberPropertyId, $year, $quarter);
     $statsAvg = [];
     foreach ($statsQuarterly as $stats) {
         $propValueKey = 'memProperty.' . $memberPropertyId;
         if (empty($stats[$propValueKey])) {
             continue;
         }
         $propId = $propertyOperate;
         $propValue = $stats[$propValueKey];
         $avg = $stats['avg'];
         $statsAvg = ModelStatsMemberPropAvgTradeQuarterly::getByPropAndDate($accountId, $propId, $propValue, $year, $quarter);
         if (!empty($statsAvg)) {
             $statsAvg->avg = $avg;
         } else {
             $statsAvg = new ModelStatsMemberPropAvgTradeQuarterly();
             $statsAvg->propId = $propId;
             $statsAvg->propValue = $propValue;
             $statsAvg->avg = $avg;
             $statsAvg->year = $year;
             $statsAvg->quarter = $quarter;
             $statsAvg->accountId = $accountId;
         }
         try {
             $statsAvg->save();
         } catch (Exception $e) {
             ResqueUtil::log(['Update StatsMemberPropAvgTradeQuarterly error' => $e->getMessage(), 'StatsMemberPropAvgTradeQuarterly' => $statsAvg]);
             continue;
         }
     }
 }
 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 static function generateStatsMemberPropTradeQuarterlyData($propertyId, $condition)
 {
     $campaignLogDailys = StatsMemberCampaignLogDaily::getCollection()->aggregate(['$match' => $condition], ['$group' => ['_id' => ['propValue' => '$memProperty.' . $propertyId, 'memberId' => '$memberId']]], ['$group' => ['_id' => ['propValue' => '$_id.propValue'], 'total' => ['$sum' => 1]]]);
     $rows = [];
     if (!empty($campaignLogDailys)) {
         foreach ($campaignLogDailys as $item) {
             $rows[] = ['propId' => $propertyId, 'propValue' => $item['_id']['propValue'], 'total' => $item['total'], 'year' => $condition['year'], 'quarter' => $condition['quarter'], 'accountId' => $condition['accountId']];
         }
         StatsMemberPropTradeQuarterly::batchInsert($rows);
         LogUtil::info(['message' => $condition['quarter'] . ':StatsMemberPropTradeQuarterly =>' . count($rows)], 'update_job');
         unset($rows);
     }
 }
 public static function generateData($memberProperty, $property, $year, $quarter, $accountId)
 {
     $propertyKey = 'memProperty.' . $memberProperty->_id;
     $keys = ['productId' => true, $propertyKey => true];
     $condition = ['year' => $year, 'quarter' => $quarter, 'accountId' => $accountId];
     $initial = ['avg' => 0, 'codes' => ['count' => 0], 'members' => ['count' => 0]];
     $reduce = 'function(doc, prev) {
         if (!prev.members[doc.memberId]) {
             prev.members[doc.memberId] = true;
             prev.members["count"]++;
         }
         if (!prev.codes[doc.code]) {
             prev.codes[doc.code] = true;
             prev.codes["count"]++;
         }
     }';
     $finalize = 'function(prev) {
         prev.avg = prev.codes["count"] / prev.members["count"];
         delete prev.codes;
         delete prev.members;
     }';
     $statsItems = ModelStatsMemberCampaignLogDaily::getCollection()->group($keys, $initial, $reduce, ['condition' => $condition, 'finalize' => $finalize]);
     foreach ($statsItems as $statsItem) {
         $condition['propId'] = $property;
         $condition['propValue'] = $statsItem[$propertyKey];
         $productId = $statsItem['productId'];
         $condition['productId'] = $productId;
         $stats = ModelStatsMemberPropTradeCodeAvgQuarterly::findOne($condition);
         if (empty($stats)) {
             $stats = new ModelStatsMemberPropTradeCodeAvgQuarterly();
             $product = Product::findByPk($productId);
             $productName = '';
             if (!empty($product)) {
                 $productName = $product->name;
             }
             $stats->propId = $property;
             $stats->propValue = $statsItem[$propertyKey];
             $stats->productId = $productId;
             $stats->productName = $productName;
             $stats->year = $year;
             $stats->quarter = $quarter;
             $stats->accountId = $accountId;
         }
         $stats->avg = $statsItem['avg'];
         $stats->save();
     }
 }
 public function perform()
 {
     //accountId, properties are required fileds
     $args = $this->args;
     if (empty($args['accountId']) || empty($args['properties'])) {
         ResqueUtil::log('Missing required arguments accountId or properties!');
         return false;
     }
     $date = empty($args['date']) ? '' : $args['date'];
     $datetime = TimeUtil::getDatetime($date);
     $dateStr = date('Y-m-d', $datetime);
     $start = new MongoDate($datetime);
     $end = new MongoDate(strtotime('+1 day', $datetime));
     $accountId = new MongoId($args['accountId']);
     $condition = ['accountId' => $accountId, 'createdAt' => ['$gte' => $start, '$lt' => $end]];
     $campaignLogs = self::getCampaignLog($condition);
     if (empty($campaignLogs)) {
         LogUtil::info(['date' => date('Y-m-d H:i:s'), 'message' => $dateStr . ': campaignLogs is empty,no need to store data'], 'resque');
         return true;
     }
     //get all member info
     $memberInfos = self::getMemberInfo($condition);
     //Get all the property mongo id for comparison
     $condition = ['propertyId' => ['$in' => $args['properties']], 'accountId' => $accountId];
     $propertyIdStrs = self::getPropertyIds($condition);
     //Generate the meta data for inserting
     $statsRows = [];
     foreach ($campaignLogs as $campaignLog) {
         $campaignLog = $campaignLog['_id'];
         $redeemTime = self::getRedeemTime($campaignLog);
         //check the redeem time whether exists
         $condition = ['code' => $campaignLog['code'], 'productId' => $campaignLog['productId'], 'month' => date('Y-m', $redeemTime)];
         $memberCampaignLogDaily = ModelStatsMemberCampaignLogDaily::findOne($condition);
         if (empty($memberCampaignLogDaily)) {
             $memProperty = self::getProperty((string) $campaignLog['member']['id'], $memberInfos, $propertyIdStrs);
             $statsRows[] = ['memberId' => $campaignLog['member']['id'], 'memProperty' => $memProperty, 'productId' => $campaignLog['productId'], 'code' => $campaignLog['code'], 'year' => date('Y', $redeemTime), 'month' => date('Y-m', $redeemTime), 'quarter' => TimeUtil::getQuarter($redeemTime), 'accountId' => $accountId, 'createdAt' => new MongoDate(strtotime('+1 day', $datetime) - 1)];
         }
     }
     ModelStatsMemberCampaignLogDaily::batchInsert($statsRows);
     unset($statsRows, $memberCampaignLogDaily, $condition, $memProperty, $memberInfos);
     return true;
 }
 /**
  * get total base on the memberId and property
  */
 public static function getTotalWithMember($item, $propertyId, $accountId)
 {
     $where = ['memProperty' . $propertyId => $item['_id']['propValue'], 'year' => $item['_id']['year'], 'quarter' => $item['_id']['quarter'], 'accountId' => $accountId];
     $summary = StatsMemberCampaignLogDaily::getCollection()->aggregate(['$match' => $where], ['$group' => ['_id' => ['propValue' => '$memProperty.' . $propertyId, 'memberId' => '$memberId']]], ['$group' => ['_id' => ['propValue' => '$_id.propValue'], 'total' => ['$sum' => 1]]]);
     if (empty($summary)) {
         return 0;
     } else {
         return $summary[0]['total'];
     }
 }
 /**
  * get
  */
 public static function getTotalWithProductId($where)
 {
     $summary = StatsMemberCampaignLogDaily::getCollection()->aggregate(['$match' => $where], ['$group' => ['_id' => ['productId' => '$productId'], 'total' => ['$sum' => 1]]]);
     if (empty($summary)) {
         return 0;
     } else {
         return $summary[0]['total'];
     }
 }