示例#1
0
    def get_data(self):
        """FQ5課金ユーザ.
        """
        # 1日のDate.
        s_time = DateTimeUtil.strToDateTime(self.date.strftime("%Y%m01"),
                                            "%Y%m%d")

        # 集計終了時間.
        e_time = DateTimeUtil.toBaseTime(self.date, 23, 59, 59)

        # 対象のガチャ.
        filters = {
            'consumetype__in': Defines.GachaConsumeType.PAYMENT_TYPES,
        }
        gachamasterlist = GachaMaster.fetchValues(filters=filters,
                                                  order_by='id',
                                                  using=backup_db)

        model_mgr = ModelRequestMgr()

        result = []
        for gachamaster in gachamasterlist:
            if gachamaster.schedule:
                # 期間チェック.
                master = model_mgr.get_model(ScheduleMaster,
                                             gachamaster.schedule,
                                             using=backup_db)
                if master and ((master.stime <= master.etime <= s_time) or
                               (e_time < master.stime <= master.etime)):
                    # 期間外.
                    continue
            # FQ5UU.
            cnt = FQ5PaymentSet.countByRange(s_time, e_time, gachamaster.id)
            result.append((gachamaster.id, cnt))
        return result
示例#2
0
 def setPaymentToCache(self, paymentlist, mid, stime, now):
     if DateTimeUtil.toBaseTime(now, 0) <= stime:
         return None
     client = localcache.Client()
     key = "view_gacha_payment_proceeds:%s:%s" % (mid,
                                                  stime.strftime("%Y%m%d"))
     client.set(key, paymentlist)
示例#3
0
 def getPaymentFromCache(self, mid, stime, now):
     if DateTimeUtil.toBaseTime(now, 0) <= stime:
         return None
     client = localcache.Client()
     key = "view_gacha_payment_proceeds:%s:%s" % (mid,
                                                  stime.strftime("%Y%m%d"))
     return client.get(key)
示例#4
0
    def get_data(self):

        config_cls_list = (CurrentRaidEventConfig, CurrentScoutEventConfig,
                           CurrentBattleEventConfig)
        # 各configの期間を見る.
        for config_cls in config_cls_list:
            config = config_cls.getByKey(config_cls.SINGLE_ID, using=backup_db)
            if config is None or config.mid < 1:
                continue

            s_time = DateTimeUtil.toBaseTime(config.starttime, 0)
            e_time = DateTimeUtil.toBaseTime(
                config.endtime + datetime.timedelta(days=1), 0)
            if s_time <= self.date < e_time:
                return self.get_data_by_range(s_time, e_time)

        return None
示例#5
0
 def get_data(self):
     """ユーザごとのガチャデータ.
     """
     # 7日前.
     s_time = DateTimeUtil.toBaseTime(self.date - datetime.timedelta(days=7), 0)
     e_time = self.date
     
     # 過去1週間以内にログインしたユーザー.
     str_uidlist = WeeklyLoginSet.getUserIdListByRange(s_time, e_time)
     
     # 対象のガチャ.
     filters = {
         'consumetype__in' : Defines.GachaConsumeType.PAYMENT_TYPES,
     }
     gachamasterlist = GachaMaster.fetchValues(filters=filters, order_by='id', using=backup_db)
     
     model_mgr = ModelRequestMgr()
     
     def checkSchedule(gachamaster):
         if gachamaster.schedule:
             # 期間チェック.
             master = model_mgr.get_model(ScheduleMaster, gachamaster.schedule, using=backup_db)
             if master and ((master.stime <= master.etime <= s_time) or (e_time < master.stime <= master.etime)):
                 # 期間外.
                 return False
         return True
     
     midlist = [gachamaster.id for gachamaster in gachamasterlist if checkSchedule(gachamaster)]
     self.__midlist = midlist
     
     redisdb = GachaLastStepSortSet.getDB()
     result = []
     if midlist:
         for str_uid in str_uidlist:
             if not str_uid or not str(str_uid).isdigit():
                 continue
             uid = int(str_uid)
             
             tmp_model_mgr = ModelRequestMgr()
             idlist = [GachaPlayCount.makeID(uid, mid) for mid in midlist]
             # 回転数.
             countdict = BackendApi.get_model_dict(tmp_model_mgr, GachaPlayCount, idlist, using=backup_db, key=lambda x:x.mid)
             
             # 課金額.
             paydict = BackendApi.get_model_dict(tmp_model_mgr, GachaConsumePoint, idlist, using=backup_db, key=lambda x:x.mid)
             
             for mid in midlist:
                 if not countdict.get(mid):
                     continue
                 cnt = countdict[mid].cnttotal
                 pay = paydict[mid].point if paydict.get(mid) else 0
                 step = redisdb.zscore(GachaLastStepSortSet.makeKey(self.date, mid), uid) or 0
                 result.append((uid, mid, cnt, pay, step))
     return result
示例#6
0
    def process(self):

        model_mgr = self.getModelMgr()
        appconfig = BackendApi.get_appconfig(model_mgr,
                                             using=settings.DB_READONLY)
        if appconfig.is_maintenance():
            # メンテ中は送信しない.
            self.send(200, 'maintenance')
            return

        args = self.getUrlArgs('/paymentlog_post/')
        str_target_date = args.get(0)
        if str_target_date:
            target_date = DateTimeUtil.strToDateTime(
                str_target_date, Handler.TARGET_DATE_FORMAT)
        else:
            # 未指定の場合は前日分.
            target_date = DateTimeUtil.toBaseTime(
                OSAUtil.get_now() - datetime.timedelta(days=1), 0)

        model_cls_list = (
            GachaPaymentEntry,
            ShopPaymentEntry,
        )
        post_nums = {
            str_target_date: {
                'sp': 0,
                'pc': 0,
            }
        }
        self.__logs = []
        for model_cls in model_cls_list:
            overwrite_sp = post_nums[str_target_date].get('sp', 0) < 1
            overwrite_pc = post_nums[str_target_date].get('pc', 0) < 1

            tmp_post_nums = self.work(model_cls, target_date, overwrite_sp,
                                      overwrite_pc) or {}
            for str_date, nums in tmp_post_nums.items():
                dic = post_nums[str_date] = post_nums.get(str_date) or {}
                for k, v in nums.items():
                    dic[k] = dic.get(k, 0) + v

            if self.response.isEnd:
                return

        # 送信した件数.
        self.__logs.append(u'nums:')
        for str_date, nums in post_nums.items():
            self.__logs.append(
                u'%s:sp=%s,pc=%s' %
                (str_date, nums.get('sp', 0), nums.get('pc', 0)))

        self.__logs.insert(0, 'OK')
        self.send(200, '\n'.join(self.__logs))
示例#7
0
    def get_data(self):

        result = []

        # 指輪のマスターデータ.
        master_dict = dict([
            (master.id, master.name) for master in CardMaster.fetchValues(
                filters={'ckind': Defines.CardKind.EVOLUTION}, using=backup_db)
        ])
        if not master_dict:
            return None
        midlist = master_dict.keys()
        waylist = Defines.CardGetWayType.NAMES.keys()

        titles = [u'ユーザID']
        for mid in midlist:
            for way in waylist:
                result.append(
                    u'%s(%s)' %
                    (master_dict[mid].name, Defines.CardGetWayType.NAMES[way]))
        titles.extend([u'直近一ヶ月の課金額', u'生涯課金額'])
        result.append(titles)

        # 7日前.
        s_time = DateTimeUtil.toBaseTime(
            self.date - datetime.timedelta(days=7), 0)
        e_time = self.date

        # 過去1週間以内にログインしたユーザー.
        str_uidlist = WeeklyLoginSet.getUserIdListByRange(s_time, e_time)

        redisdb = RingGetNumHash.getDB()
        keys = [RingGetNumHash.makeKey(self.date, mid) for mid in midlist]

        union_key = DailyPaymentPointSet.makeUnionSortSet(s_time, e_time)

        for str_uid in str_uidlist:
            row = []

            uid = int(str_uid)
            row.append(uid)

            # 各カードの枚数.
            members = [RingGetNumHash.makeMember(uid, way) for way in waylist]
            for key in keys:
                values = redisdb.hmget(key, members)
                for v in values:
                    v = int(str(v)) if str(v).isdigit() else 0
                    row.append(v)

            # 直近1ヶ月の課金額.
            point = redisdb.zscore(union_key, uid) or 0
            row.append(point)

            # 生涯課金額.
            model = PlayerConsumePoint.getByKey(uid, using=backup_db)
            row.append(model.point_total if model else 0)

            result.append(row)

        # 後片付け.
        redisdb.delete(union_key)

        return result
示例#8
0
 def get_batch_section_lasttime(self):
     """バッチで確認する時間の境界."""
     now = OSAUtil.get_now()
     basetime = DateTimeUtil.toBaseTime(now, now.hour)
     return basetime - timedelta(microseconds=1)
示例#9
0
    def makeProceeds(self, master):
        """ガチャの課金情報を集計.
        """
        model_mgr = self.getModelMgr()
        appstime = DateTimeUtil.strToDateTime("20131224", "%Y%m%d")

        dest = {
            'id': master.id,
            'name': master.name,
        }
        schedulemaster = None
        if master.schedule:
            schedulemaster = BackendApi.get_schedule_master(
                model_mgr, master.schedule, using=settings.DB_READONLY)

        now = OSAUtil.get_now()
        if schedulemaster:
            stime = max(appstime, schedulemaster.stime)
            etime = min(now, schedulemaster.etime)
        else:
            stime = appstime
            etime = now

        table = {}
        filters = {
            'state': PaymentData.Status.COMPLETED,
            'iid': master.id,
        }
        cur_stime = stime

        useridset_total = set()
        count_total = 0

        while cur_stime < etime:

            filters['ctime__gte'] = cur_stime
            filters['ctime__lt'] = DateTimeUtil.toBaseTime(
                cur_stime + datetime.timedelta(days=1), 0)

            paymentlist = self.getPaymentFromCache(master.id, cur_stime, now)
            if paymentlist is None:
                paymentlist = GachaPaymentEntry.fetchValues(
                    ['uid', 'inum', 'price'],
                    filters=filters,
                    using=settings.DB_READONLY)
                self.setPaymentToCache(paymentlist, master.id, cur_stime, now)

            str_month = cur_stime.strftime("%Y%m")

            uidset = set([payment.uid for payment in paymentlist])
            cnt = len(paymentlist)

            monthdata = table[str_month] = table.get(str_month) or {
                'total': 0,
                'datalist': [],
                'name': cur_stime.strftime(u"%Y年%m月"),
                'count': 0,
                'uu': set()
            }
            monthdata['count'] += cnt
            monthdata['uu'] |= uidset
            useridset_total |= uidset
            count_total += cnt

            price = sum(
                [payment.inum * payment.price for payment in paymentlist])
            monthdata['datalist'].append({
                'day': cur_stime.day,
                'price': price,
                'uu': uidset,
                'count': cnt,
            })
            monthdata['total'] += price

            cur_stime = filters['ctime__lt']

        monthlist = table.keys()
        monthlist.sort()
        dest['table'] = [table[month] for month in monthlist]
        dest['total'] = sum([data['total'] for data in dest['table']])
        dest['uu'] = useridset_total
        dest['count'] = count_total

        return dest
示例#10
0
 def get_data(self):
     date = DateTimeUtil.toBaseTime(self.date, 0)
     return self.get_data_by_range(date, date)