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
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)
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)
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
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
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))
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
def get_batch_section_lasttime(self): """バッチで確認する時間の境界.""" now = OSAUtil.get_now() basetime = DateTimeUtil.toBaseTime(now, now.hour) return basetime - timedelta(microseconds=1)
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
def get_data(self): date = DateTimeUtil.toBaseTime(self.date, 0) return self.get_data_by_range(date, date)