feat: balance and reward
This commit is contained in:
2
database/models/__init__.py
Normal file
2
database/models/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from .basic import *
|
||||
from .balance import *
|
||||
40
database/models/balance.py
Normal file
40
database/models/balance.py
Normal file
@@ -0,0 +1,40 @@
|
||||
from sqlalchemy import Connection, func
|
||||
from sqlalchemy.dialects.postgresql import JSONB
|
||||
from sqlalchemy.orm import Mapper
|
||||
|
||||
import database
|
||||
from database import db
|
||||
|
||||
|
||||
class BalanceTransaction(db.Model):
|
||||
__tablename__ = 'balance_transactions'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True, comment='ID транзакции')
|
||||
type = db.Column(db.Integer, nullable=False, comment='Тип транзакции')
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
|
||||
user = db.relationship('User', backref='transactions')
|
||||
amount = db.Column(db.Double, nullable=False, comment='Сумма транзакции')
|
||||
description = db.Column(db.Text, nullable=False, comment='Описание')
|
||||
json_data = db.Column(JSONB, comment='JSON данные')
|
||||
created_at = db.Column(db.DateTime, nullable=False, comment='Дата и время создания транзакции')
|
||||
|
||||
|
||||
def recalculate_user_balance(user_id: int):
|
||||
user_balance = (database.BalanceTransaction.query.filter_by(user_id=user_id)
|
||||
.group_by(database.BalanceTransaction.user_id)
|
||||
.with_entities(func.sum(database.BalanceTransaction.amount))
|
||||
.scalar()) or 0
|
||||
|
||||
(db.session.query(database.User)
|
||||
.filter_by(id=user_id)
|
||||
.update({'balance': user_balance}, synchronize_session='fetch'))
|
||||
|
||||
|
||||
@db.event.listens_for(BalanceTransaction, 'after_insert')
|
||||
def after_balance_transaction_insert(mapper: Mapper, connection: Connection, target: BalanceTransaction):
|
||||
recalculate_user_balance(target.user_id)
|
||||
|
||||
|
||||
@db.event.listens_for(BalanceTransaction, 'after_delete')
|
||||
def after_balance_transaction_delete(mapper: Mapper, connection: Connection, target: BalanceTransaction):
|
||||
recalculate_user_balance(target.user_id)
|
||||
46
database/models/basic.py
Normal file
46
database/models/basic.py
Normal file
@@ -0,0 +1,46 @@
|
||||
from database import db
|
||||
|
||||
|
||||
class User(db.Model):
|
||||
__tablename__ = 'users'
|
||||
id = db.Column(db.Integer, primary_key=True, comment='ID пользователя')
|
||||
|
||||
login = db.Column(db.String, nullable=False, comment='Логин')
|
||||
password_hash = db.Column(db.String, nullable=False, comment='Пароль')
|
||||
|
||||
sipro_id = db.Column(db.Integer, nullable=True, comment='ID пользователя в SIPRO')
|
||||
is_admin = db.Column(db.Boolean, nullable=False, default=False, server_default='0', comment='Админ ли юзверь')
|
||||
|
||||
city_id = db.Column(db.Integer, nullable=False, default='1', server_default='1', comment='ID страны')
|
||||
balance = db.Column(db.Double, nullable=False, default=0, server_default='0', comment='Баланс пользователя')
|
||||
|
||||
|
||||
class Assembly(db.Model):
|
||||
__tablename__ = 'assemblies'
|
||||
id = db.Column(db.Integer, primary_key=True, comment='ID сборки')
|
||||
|
||||
created_at = db.Column(db.DateTime, nullable=True, comment='Дата и время начала сборки')
|
||||
ended_at = db.Column(db.DateTime, nullable=True, comment='Дата и время конца сборки')
|
||||
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
|
||||
user = db.relationship('User', backref='assemblies')
|
||||
|
||||
order_id = db.Column(db.Integer, nullable=False, comment='ID заказа в базе данных', index=True)
|
||||
is_active = db.Column(db.Boolean, nullable=False, comment='Активная ли сборка')
|
||||
state = db.Column(db.Integer, nullable=False, comment='Состояние сборки')
|
||||
|
||||
|
||||
class Barcode(db.Model):
|
||||
__tablename__ = 'barcodes'
|
||||
id = db.Column(db.Integer, primary_key=True, comment='ID пользователя')
|
||||
denco_article = db.Column(db.Integer, nullable=False, comment='Артикул', index=True)
|
||||
barcode = db.Column(db.String, nullable=False, comment='Баркод', index=True)
|
||||
|
||||
|
||||
class Application(db.Model):
|
||||
__tablename__ = 'applications'
|
||||
id = db.Column(db.Integer, primary_key=True, comment='')
|
||||
name = db.Column(db.String(40), nullable=False)
|
||||
version = db.Column(db.String(10), nullable=False)
|
||||
uploaded = db.Column(db.DateTime, nullable=False)
|
||||
filename = db.Column(db.String, nullable=False)
|
||||
Reference in New Issue
Block a user