Показано с 1 по 10 из 10

Тема: Проверка баланса

  1. #1
    Banned
    Регистрация
    03.01.2014
    Адрес
    Россия
    Сообщений
    958
    Поблагодарил(а)
    4
    Благодарностей: 9 (сообщений: 6)

    Проверка баланса

    Здравствуйте.
    Имеем, игровую зону, два турникета вход - выход.
    Соответственно один - начало тарификации, второй завершение тарификации.
    Есть необходимость поставить еще один контроллер меду ними.
    Поставили, задача, чтобы клиент после входа в зону и нахождении в ней мог подойти к этому контроллеру и проверить свой текущий баланс.

    Установили, настроили, создали правило для этого контролера, по нулевой цене завели это правило, прописали его в необходимый уровень.
    Все работает.
    Клиент проводит картой и ему показывает баланс, но.

    Клиенту показывает баланс который у него был до входа в зону, скажем до входа было 50 рублей, после 10 минут нахождения в зоне баланс реальный будет скажем 40 рублей, а при проведении по этому контроллеру нам показывает баланс 50 рублей.
    Как реализовать , чтобы он отображал баланс так сказать онлайн?
    Если это возможно вообще.
    Спасибо.

  2. #2
    Разбирающийся
    Регистрация
    20.10.2011
    Адрес
    Кыргызстан
    Сообщений
    988
    Поблагодарил(а)
    55
    Благодарностей: 35 (сообщений: 24)
    Цитата Сообщение от Hendehog Посмотреть сообщение
    Здравствуйте.
    Имеем, игровую зону, два турникета вход - выход.
    Соответственно один - начало тарификации, второй завершение тарификации.
    Есть необходимость поставить еще один контроллер меду ними.
    Поставили, задача, чтобы клиент после входа в зону и нахождении в ней мог подойти к этому контроллеру и проверить свой текущий баланс.

    Установили, настроили, создали правило для этого контролера, по нулевой цене завели это правило, прописали его в необходимый уровень.
    Все работает.
    Клиент проводит картой и ему показывает баланс, но.

    Клиенту показывает баланс который у него был до входа в зону, скажем до входа было 50 рублей, после 10 минут нахождения в зоне баланс реальный будет скажем 40 рублей, а при проведении по этому контроллеру нам показывает баланс 50 рублей.
    Как реализовать , чтобы он отображал баланс так сказать онлайн?
    Если это возможно вообще.
    Спасибо.
    Надо настроить, чтобы при входе в зону уже снималась сумма, кажется это называется предоплата за определенное нахождение в зоне.
    Это для начала.

  3. #3
    Banned
    Регистрация
    03.01.2014
    Адрес
    Россия
    Сообщений
    958
    Поблагодарил(а)
    4
    Благодарностей: 9 (сообщений: 6)
    Цитата Сообщение от mnekin Посмотреть сообщение
    Надо настроить, чтобы при входе в зону уже снималась сумма, кажется это называется предоплата за определенное нахождение в зоне.
    Это для начала.
    И, что мы с этого получим?
    Ну было у него 100 рублей, предоплатой мы берем на входе скажем 20 рублей, ну вошел он , сняло у него 20 рублей, подъедет он через 10 минут , проведет картой ему покажет 80 рублей.

  4. #4
    Banned
    Регистрация
    03.01.2014
    Адрес
    Россия
    Сообщений
    958
    Поблагодарил(а)
    4
    Благодарностей: 9 (сообщений: 6)
    Вообщем UCS сказали, что такой функции у них нету, а сделают они если она будет и другим пользователям нужна..

  5. #5
    Разбирающийся Аватар для NeiroN
    Регистрация
    30.01.2015
    Адрес
    Ижевск
    Сообщений
    119
    Поблагодарил(а)
    0
    Благодарностей: 5 (сообщений: 3)

    Терминал проверки баланса

    Я сделал себе терминал проверки баланса на базе ПК - работает напрямую с базой. То что показывает - контроллер - правильно, баланс спишется в момент выхода. Имея такой терминал - можно показывать баланс с учетом времени проведенным в зоне.

    Помимо терминала есть также проверка баланса с сайта развлекательного центра - можно хоть с мобильного телефона смотреть(есть отдельная страница без лишней информации).
    вот так это выглядит на сайте моего игрового центра http://igromax18.ru/card/balance.html у вас наверно будет как-то по другому.
    Последний раз редактировалось NeiroN; 07.02.2015 в 20:21.

  6. #6
    Banned
    Регистрация
    03.01.2014
    Адрес
    Россия
    Сообщений
    958
    Поблагодарил(а)
    4
    Благодарностей: 9 (сообщений: 6)
    Цитата Сообщение от NeiroN Посмотреть сообщение

    Помимо терминала есть также проверка баланса с сайта развлекательного центра - можно хоть с мобильного телефона смотреть(есть отдельная страница без лишней информации).
    вот так это выглядит на сайте моего игрового центра http://igromax18.ru/card/balance.html у вас наверно будет как-то по другому.
    А кодом проверки баланса на сайте не поделитесь?

  7. #7
    Сведущий
    Регистрация
    08.11.2012
    Адрес
    Барнаул
    Сообщений
    88
    Поблагодарил(а)
    0
    Благодарностей: 0 (сообщений: 0)
    Цитата Сообщение от Hendehog Посмотреть сообщение
    А кодом проверки баланса на сайте не поделитесь?
    Тоже присоединяюсь к данной просьбе!

  8. #8
    Разбирающийся Аватар для NeiroN
    Регистрация
    30.01.2015
    Адрес
    Ижевск
    Сообщений
    119
    Поблагодарил(а)
    0
    Благодарностей: 5 (сообщений: 3)

    Post

    Кодом - пожалуйста! Но все вопросы и коментарии за отдельную плату.
    Конечно это не всеь код, а лишь часть с проверкой баланса как на сайте.
    Код:
    #!/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(кода выше вполне достаточно).
    Последний раз редактировалось NeiroN; 09.02.2015 в 17:02.

  9. #9
    Banned
    Регистрация
    03.01.2014
    Адрес
    Россия
    Сообщений
    958
    Поблагодарил(а)
    4
    Благодарностей: 9 (сообщений: 6)
    Цитата Сообщение от NeiroN Посмотреть сообщение
    Я сделал себе терминал проверки баланса на базе ПК - работает напрямую с базой. То что показывает - контроллер - правильно, баланс спишется в момент выхода. Имея такой терминал - можно показывать баланс с учетом времени проведенным в зоне.
    Можешь подробнее рассказать?
    Как нам такое реализовать?
    Какой SQL запрос нужно отсылать?Можешь поделится ? В какой таблице хранятся эти данные?

  10. #10
    Разбирающийся Аватар для NeiroN
    Регистрация
    30.01.2015
    Адрес
    Ижевск
    Сообщений
    119
    Поблагодарил(а)
    0
    Благодарностей: 5 (сообщений: 3)
    Так как у нас зоны не используюся, то могу только догадываться как это работает(по колонкам таблицы). За нахождение людей в зоне отвечает таблица gk.TRF - там прописываются все параметры по нахождению карты в зоне. Так как баланс с карты снимется при выходе - нужно расчитывать баланс на текущее время - оплачивается каждый час, есть датавремя входа и текущее время - нужно найти количество часов (берем и находим). Знаем что за зона и сколько там будет стоить 1 час - находим сумму которая снимется с карты если выйти прямо сейчас и отнимаем ее от баланса карты(который хранится в базе) - получаем реальный баланс. Если учитывать все параметры зоны(бесплатное время, остановки тарификации, и т.д.) то расчет усложняется.

    Вобщем все реально сделать можно даже на самом MSSQL считать. про язык SQL можете почитать тут https://msdn.microsoft.com/ru-ru/library/bb934481.aspx


    Если хотите код бесплатно, то придется самим поразбираться в работе GK.
    Последний раз редактировалось NeiroN; 18.02.2015 в 17:21.

Похожие темы

  1. Проверка данных
    от Brambrulet в разделе SH: Технические вопросы
    Ответов: 8
    Последнее сообщение: 28.03.2019, 11:37
  2. Ответов: 6
    Последнее сообщение: 30.11.2014, 19:10
  3. Проверка лизензий
    от mr_deep в разделе Ключи, лицензирование StoreHouse
    Ответов: 1
    Последнее сообщение: 23.03.2013, 21:38
  4. Печать баланса гостей
    от Vladimir в разделе RK: Сервис-печать, принтеры
    Ответов: 3
    Последнее сообщение: 12.04.2012, 20:01
  5. Печать системного баланса
    от Gusman в разделе R-Keeper 6
    Ответов: 3
    Последнее сообщение: 05.08.2008, 13:11

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •