Просмотр полной версии : Проверка баланса
Hendehog
25.12.2014, 10:23
Здравствуйте.
Имеем, игровую зону, два турникета вход - выход.
Соответственно один - начало тарификации, второй завершение тарификации.
Есть необходимость поставить еще один контроллер меду ними.
Поставили, задача, чтобы клиент после входа в зону и нахождении в ней мог подойти к этому контроллеру и проверить свой текущий баланс.
Установили, настроили, создали правило для этого контролера, по нулевой цене завели это правило, прописали его в необходимый уровень.
Все работает.
Клиент проводит картой и ему показывает баланс, но.
Клиенту показывает баланс который у него был до входа в зону, скажем до входа было 50 рублей, после 10 минут нахождения в зоне баланс реальный будет скажем 40 рублей, а при проведении по этому контроллеру нам показывает баланс 50 рублей.
Как реализовать , чтобы он отображал баланс так сказать онлайн?
Если это возможно вообще.
Спасибо.
Здравствуйте.
Имеем, игровую зону, два турникета вход - выход.
Соответственно один - начало тарификации, второй завершение тарификации.
Есть необходимость поставить еще один контроллер меду ними.
Поставили, задача, чтобы клиент после входа в зону и нахождении в ней мог подойти к этому контроллеру и проверить свой текущий баланс.
Установили, настроили, создали правило для этого контролера, по нулевой цене завели это правило, прописали его в необходимый уровень.
Все работает.
Клиент проводит картой и ему показывает баланс, но.
Клиенту показывает баланс который у него был до входа в зону, скажем до входа было 50 рублей, после 10 минут нахождения в зоне баланс реальный будет скажем 40 рублей, а при проведении по этому контроллеру нам показывает баланс 50 рублей.
Как реализовать , чтобы он отображал баланс так сказать онлайн?
Если это возможно вообще.
Спасибо.
Надо настроить, чтобы при входе в зону уже снималась сумма, кажется это называется предоплата за определенное нахождение в зоне.
Это для начала.
Hendehog
26.12.2014, 06:24
Надо настроить, чтобы при входе в зону уже снималась сумма, кажется это называется предоплата за определенное нахождение в зоне.
Это для начала.
И, что мы с этого получим?
Ну было у него 100 рублей, предоплатой мы берем на входе скажем 20 рублей, ну вошел он , сняло у него 20 рублей, подъедет он через 10 минут , проведет картой ему покажет 80 рублей.
Hendehog
22.01.2015, 12:02
Вообщем UCS сказали, что такой функции у них нету, а сделают они если она будет и другим пользователям нужна..
Я сделал себе терминал проверки баланса на базе ПК - работает напрямую с базой. То что показывает - контроллер - правильно, баланс спишется в момент выхода. Имея такой терминал - можно показывать баланс с учетом времени проведенным в зоне.
Помимо терминала есть также проверка баланса с сайта развлекательного центра - можно хоть с мобильного телефона смотреть(есть отдельная страница без лишней информации).
вот так это выглядит на сайте моего игрового центра http://igromax18.ru/card/balance.html (http://igromax18.ru/card/balance.html?card=2200252) у вас наверно будет как-то по другому.
Hendehog
09.02.2015, 07:31
Помимо терминала есть также проверка баланса с сайта развлекательного центра - можно хоть с мобильного телефона смотреть(есть отдельная страница без лишней информации).
вот так это выглядит на сайте моего игрового центра http://igromax18.ru/card/balance.html (http://igromax18.ru/card/balance.html?card=2200252) у вас наверно будет как-то по другому.
А кодом проверки баланса на сайте не поделитесь?
А кодом проверки баланса на сайте не поделитесь?
Тоже присоединяюсь к данной просьбе! :)
Кодом - пожалуйста! Но все вопросы и коментарии за отдельную плату.
Конечно это не всеь код, а лишь часть с проверкой баланса как на сайте.
#!/usr/bin/env python
# -*- coding: utf8 -*-
from flask import Flask, request, current_app, Response
from pymssql import connect as pymssql_connect
from datetime import *
import os, sys, decimal
app = Flask(__name__)
FORMAT_DATE = "%d.%m.%Y"
FORMAT_TIME = "%H:%M:%S"
FORMAT = FORMAT_DATE+" "+FORMAT_TIME
mbalance_htm = u"""<!DOCTYPE html>
<html>
<head><title>Проверка баланса карт</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, maximum-scale=1" />
</head>
<body>
<form method="get">
<h3>Проверка баланса</h3>
<input size="15" type="text" autofocus="true" name="card" maxlength="7" placeholder="номер карты" value="{}"/>
<input type="submit" value="Баланс"/>
</form>
<div id="balance">
{}
</div>
</body>
</html>"""
def decimal_default(obj):
if isinstance(obj, decimal.Decimal):
return float(obj)
if isinstance(obj, datetime):
return obj.strftime(FORMAT)
return str(obj)
def get_db():
"""Opens a new database connection if there is none yet for the
current application context.
"""
db = getattr(current_app, 'mssql_db', None)
if db is None:
dbcfg = current_app.mssql_config
db = current_app.mssql_db = pymssql_connect(
host="192.168.0.2",
user="user",
password="password",
database='gkArcade',
as_dict=True,
charset='cp1251',
timeout=10,
login_timeout=7
)
db.autocommit(True)
return db
@app.teardown_appcontext
def close_db_connection(exception):
"""Closes the database again at the end of the request."""
db = getattr(current_app, 'mssql_db', None)
if db is not None:
current_app.mssql_db = None
db.close()
def get_info(db, card):
cur = db.cursor()
cur.execute(
"SELECT A.*,"
" L1.[NAME] as LEVEL_NAME,"
" L2.[NAME] as LEVEL2_NAME"
" FROM [gkArcade].[gk].GK_CARDS A"
" LEFT JOIN [gkArcade].[gk].LEVELS L1 ON A.[LEVEL]=L1.[LEVEL]"
" LEFT JOIN [gkArcade].[gk].LEVELS L2 ON A.[LEVEL2]=L2.[LEVEL]"
" WHERE ([Card]=%(card)s)",
{
'card':card,
}
)
account = cur.fetchone()
if account:
card = account['Card']
else:
return False
cur.execute(
" SELECT CS.*, L.NAME AS LEVEL_NAME, S.NAME AS SUB_NAME"
" FROM [gkArcade].[gk].[GK_CARDS_SUBSCRIPTIONS] CS"
" left join [gkArcade].[gk].[GK_SUBSCRIPTIONS] S on CS.SUBSCRIPTION=S.SUBSCRIPTION"
" left join [gkArcade].[gk].LEVELS L on CS.[LEVEL]=L.[LEVEL]"
" WHERE ([CARD] = %(card)s)",
{
'card':card,
}
)
result = cur.fetchall()
if len(result) > 0:
info = ""
else:
info = u'Нет'
for row in result:
info += u'\n + {}: {} , Осталось '.format(row['SUB_NAME'], row['LEVEL_NAME'])
if row['QNT'] != None:
info += u'{:.0f} игр, '.format(row['QNT'])
if row['DAILY_COUNT'] != None:
info += u'из {:.0f}'.format(row['DAILY_COUNT'])
stop = row['DATE_STOP']
start = row['DATE_START']
if start == None:
start = datetime.now()
if stop != None and stop.year == 1900:
delta = stop - datetime(1900, 1, 1, 0, 0)
else:
delta = stop - start
remains = delta - (datetime.now() - start)
remains -= timedelta(microseconds=remains.microseconds)
info += u'времени {}'.format(remains)
account['sub'] = info
return account
@app.route('/', methods=['GET'])
def mbalance():
card = request.args.get('card', request.args.get('c', request.args.get('q', '')))
if len(card.split("=")) > 2:
card = card.split("=")[2]
try:
card = int(card)
except:
card = 0
if card != '':
result = get_info(get_db(), card)
else:
result = False
if result:
card = result['Card']
if result['Level2'] is None:
level = result['LEVEL_NAME']
else:
if result['L2_ExpGames'] is None:
games = u'действителен'
else:
games = u'осталось {} игр'.format(result['L2_ExpGames'])
level = u'{} - {} до {} с переходом на {}'.format(
result['LEVEL2_NAME'],
games,
result['Level2ExpDate'],
result['LEVEL_NAME']
)
balance = u'Баланс: {:.0f} рублей<br/>Тикетов: {:.0f} купонов<br/>Последнее использование:<br/> {}<br/>Тариф: {}<br/>Сыграно игр: {:.0f}<br/>Абонементы: {}'.format(
result['Points'],
result['Coupons'],
result['CardLastUse'].strftime(FORMAT),
level,
result['Tokens'],
result['sub']
)
else:
balance = u'Карта не найдена'
return mbalance_htm.format(card, balance)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80, debug=False)
Безопасность настроена средствами MSSQL
Зависимости: Python 2.7, Flask, pymssql
Была идея сделать терминал на планшете с андроидом, с USB-ридером, на базе HTML(кода выше вполне достаточно).
Hendehog
18.02.2015, 14:34
Я сделал себе терминал проверки баланса на базе ПК - работает напрямую с базой. То что показывает - контроллер - правильно, баланс спишется в момент выхода. Имея такой терминал - можно показывать баланс с учетом времени проведенным в зоне.
Можешь подробнее рассказать?
Как нам такое реализовать?
Какой SQL запрос нужно отсылать?Можешь поделится ? В какой таблице хранятся эти данные?
Так как у нас зоны не используюся, то могу только догадываться как это работает(по колонкам таблицы). За нахождение людей в зоне отвечает таблица gk.TRF - там прописываются все параметры по нахождению карты в зоне. Так как баланс с карты снимется при выходе - нужно расчитывать баланс на текущее время - оплачивается каждый час, есть датавремя входа и текущее время - нужно найти количество часов (берем и находим). Знаем что за зона и сколько там будет стоить 1 час - находим сумму которая снимется с карты если выйти прямо сейчас и отнимаем ее от баланса карты(который хранится в базе) - получаем реальный баланс. Если учитывать все параметры зоны(бесплатное время, остановки тарификации, и т.д.) то расчет усложняется.
Вобщем все реально сделать можно даже на самом MSSQL считать. про язык SQL можете почитать тут https://msdn.microsoft.com/ru-ru/library/bb934481.aspx
(https://msdn.microsoft.com/ru-ru/library/bb934481.aspx)Если хотите код бесплатно, то придется самим поразбираться в работе GK.
Powered by vBulletin® Version 4.2.6 LTS Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot