diff --git a/app.py b/app.py index ed4b0ff..32305c2 100644 --- a/app.py +++ b/app.py @@ -27,6 +27,7 @@ blueprints = [ (routes.orders_blueprint, '/orders'), (routes.barcode_blueprint, '/barcode'), (routes.printing_blueprint, '/printing'), + (routes.assembly_blueprint, '/assembly'), ] for blueprint, url_prefix in blueprints: diff --git a/assemblr.log b/assemblr.log index cd654b0..1a121b3 100644 --- a/assemblr.log +++ b/assemblr.log @@ -40,3 +40,50 @@ 10-29 06:43 - assemblr - INFO - SiproClient successfully initialized 10-29 06:47 - assemblr - INFO - SiproClient successfully initialized 10-29 06:53 - assemblr - INFO - SiproClient successfully initialized +10-30 03:37 - assemblr - INFO - SiproClient successfully initialized +10-30 03:37 - assemblr - INFO - SiproClient successfully initialized +10-30 03:39 - assemblr - INFO - SiproClient successfully initialized +10-30 04:23 - assemblr - INFO - SiproClient successfully initialized +10-30 05:10 - assemblr - INFO - SiproClient successfully initialized +10-30 05:11 - assemblr - INFO - SiproClient successfully initialized +10-30 05:11 - assemblr - INFO - SiproClient successfully initialized +10-30 05:11 - assemblr - INFO - SiproClient successfully initialized +10-30 05:11 - assemblr - INFO - SiproClient successfully initialized +10-30 05:11 - assemblr - INFO - SiproClient successfully initialized +10-30 05:13 - assemblr - INFO - SiproClient successfully initialized +10-30 05:15 - assemblr - INFO - SiproClient successfully initialized +10-30 05:15 - assemblr - INFO - SiproClient successfully initialized +10-30 05:15 - assemblr - INFO - SiproClient successfully initialized +10-30 05:29 - assemblr - INFO - SiproClient successfully initialized +10-30 05:29 - assemblr - INFO - SiproClient successfully initialized +10-30 05:31 - assemblr - INFO - SiproClient successfully initialized +10-30 05:34 - assemblr - INFO - SiproClient successfully initialized +10-30 05:34 - assemblr - INFO - SiproClient successfully initialized +10-30 05:34 - assemblr - INFO - SiproClient successfully initialized +10-30 05:34 - assemblr - INFO - SiproClient successfully initialized +10-30 05:34 - assemblr - INFO - SiproClient successfully initialized +10-30 05:34 - assemblr - INFO - SiproClient successfully initialized +10-30 05:34 - assemblr - INFO - SiproClient successfully initialized +10-30 05:37 - assemblr - INFO - SiproClient successfully initialized +10-30 05:38 - assemblr - INFO - SiproClient successfully initialized +10-30 05:46 - assemblr - INFO - SiproClient successfully initialized +10-30 06:15 - assemblr - INFO - SiproClient successfully initialized +10-30 06:24 - assemblr - INFO - SiproClient successfully initialized +10-30 06:24 - assemblr - INFO - SiproClient successfully initialized +10-30 07:14 - assemblr - INFO - SiproClient successfully initialized +10-30 07:18 - assemblr - INFO - SiproClient successfully initialized +10-30 07:19 - assemblr - INFO - SiproClient successfully initialized +10-30 07:19 - assemblr - INFO - SiproClient successfully initialized +10-30 07:21 - assemblr - INFO - SiproClient successfully initialized +11-02 03:18 - assemblr - INFO - SiproClient successfully initialized +11-02 03:18 - assemblr - INFO - SiproClient successfully initialized +11-02 03:26 - assemblr - INFO - SiproClient successfully initialized +11-03 04:07 - assemblr - INFO - SiproClient successfully initialized +11-03 04:07 - assemblr - INFO - SiproClient successfully initialized +11-03 04:12 - assemblr - INFO - SiproClient successfully initialized +11-06 03:47 - assemblr - INFO - SiproClient successfully initialized +11-06 03:47 - assemblr - INFO - SiproClient successfully initialized +11-06 03:47 - assemblr - INFO - SiproClient successfully initialized +11-06 05:15 - assemblr - INFO - SiproClient successfully initialized +11-06 05:17 - assemblr - INFO - SiproClient successfully initialized +11-06 05:32 - assemblr - INFO - SiproClient successfully initialized diff --git a/database/enums.py b/database/enums.py new file mode 100644 index 0000000..e167a8d --- /dev/null +++ b/database/enums.py @@ -0,0 +1,10 @@ +from enum import unique, IntEnum + + +@unique +class AssemblyState(IntEnum): + NOT_STARTED = 0, + ASSEMBLING_PRODUCTS = 1, + ALL_PRODUCTS_ASSEMBLED = 2, + CONFIRMED = 3, + ENDED = 4 diff --git a/database/models.py b/database/models.py index 9b07270..2bc612c 100644 --- a/database/models.py +++ b/database/models.py @@ -17,14 +17,15 @@ class Assembly(db.Model): __tablename__ = 'assemblies' id = db.Column(db.Integer, primary_key=True, comment='ID сборки') - created_at = db.Column(db.DateTime, nullable=False, comment='Дата и время начала сборки') + 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 заказа в базе данных') - active = db.Column(db.Boolean, nullable=False, comment='Активная ли сборка') + is_active = db.Column(db.Boolean, nullable=False, comment='Активная ли сборка') + state = db.Column(db.Integer, nullable=False, comment='Состояние сборки') class Barcode(db.Model): diff --git a/routes/__init__.py b/routes/__init__.py index d306ded..eb59443 100644 --- a/routes/__init__.py +++ b/routes/__init__.py @@ -2,3 +2,4 @@ from routes.auth import auth_blueprint from routes.orders import orders_blueprint from routes.barcode import barcode_blueprint from routes.printing import printing_blueprint +from routes.assembly import assembly_blueprint diff --git a/routes/assembly.py b/routes/assembly.py index 1756711..521cd90 100644 --- a/routes/assembly.py +++ b/routes/assembly.py @@ -1,47 +1,155 @@ import datetime +import time from flask import Blueprint, request, jsonify from flask_jwt_extended import get_jwt_identity import database +from database.enums import AssemblyState from routes.utils import jwt_protect_blueprint +import sipro.api.orders assembly_blueprint = jwt_protect_blueprint(Blueprint('assembly', __name__)) -@assembly_blueprint.post('/open') +@assembly_blueprint.post('/create') def create_assembly(): - data: dict = request.json - order_id: int = data.get('orderId') - user_id = get_jwt_identity() - existing_assembly = database.Assembly.query.filter_by(order_id=order_id).first() - if existing_assembly: + try: + data: dict = request.json + order_id: int = data.get('orderId') + user_id = get_jwt_identity() + existing_assembly = database.Assembly.query.filter_by(order_id=order_id).first() + if existing_assembly: + response = { + 'ok': False, + 'message': 'Сборка этого товара уже была запущена', + 'assemblyId': existing_assembly.id, + 'statusCode': 'ASSEMBLY_ALREADY_EXISTS' + } + return jsonify(response) + active_assembly = database.Assembly.query.filter(database.Assembly.user_id == user_id, + database.Assembly.is_active == True).first() + if active_assembly: + response = { + 'ok': False, + 'message': 'Вы не можете запустить сборку заказа, так как у вас уже есть активная сборка', + 'assemblyId': active_assembly.id, + 'statusCode': 'USER_ALREADY_HAS_ACTIVE_ASSEMBLY' + } + return jsonify(response) + assembly = database.Assembly(user_id=user_id, + order_id=order_id, + state=AssemblyState.NOT_STARTED, + created_at=datetime.datetime.now(), + is_active=True) + database.db.session.add(assembly) + database.db.session.commit() response = { - 'ok': False, - 'message': 'Сборка этого товара уже была запущена', - 'assemblyId': existing_assembly.id, - 'statusCode': 'ASSEMBLY_ALREADY_EXISTS' + 'ok': True, + 'message': 'Сборка успешно запущена!', + 'assemblyId': assembly.id, + 'statusCode': 'CREATED' } return jsonify(response) - active_assembly = database.Assembly.query.filter_by(user_id=user_id).first() - if active_assembly: + except Exception as e: response = { 'ok': False, - 'message': 'Вы не можете запустить сборку заказа, так как у вас уже есть активная сборка', - 'assemblyId': active_assembly.id, - 'statusCode': 'USER_ALREADY_HAS_ACTIVE_ASSEMBLY' + 'message': f'Неизвестная ошибка: {e}', + 'assemblyId': -1, + 'statusCode': 'INVALID_EXCEPTION' } return jsonify(response) - assembly = database.Assembly(created_at=datetime.datetime.now(), - user_id=user_id, - order_id=order_id, - active=True) - database.db.session.add(assembly) + + +@assembly_blueprint.post('/close') +def close_assembly(): + args = request.json + assembly_id = args.get('assemblyId') + if not assembly_id or (not isinstance(assembly_id, int)): + response = { + 'ok': False, + 'message': 'Неверно указан ID сборки' + } + return jsonify(response) + assembly = database.db.session.get(database.Assembly, assembly_id) + if not assembly: + response = { + 'ok': False, + 'message': 'Указанная сборка не найдена' + } + return jsonify(response) + assembly.is_active = False + assembly.ended_at = datetime.datetime.now() database.db.session.commit() + order_id = assembly.order_id + return sipro.api.orders.close_order(order_id) + + +@assembly_blueprint.get('/hasActive') +def user_has_active_assembly(): + user_id = get_jwt_identity() + assemblies_count = database.Assembly.query.filter(database.Assembly.user_id == user_id, + database.Assembly.is_active == True).count() + return jsonify(has=assemblies_count > 0) + + +@assembly_blueprint.get('/getActive') +def get_active_assembly(): + user_id = get_jwt_identity() + assembly = database.Assembly.query.filter(database.Assembly.user_id == user_id, + database.Assembly.is_active == True).first() response = { - 'ok': True, - 'message': 'Сборка успешно запущена!', - 'assemblyId': assembly.id, - 'statusCode': 'CREATED' + 'databaseId': assembly.id, + 'createdAt': str(assembly.created_at), + 'endedAt': str(assembly.ended_at), + 'orderId': assembly.order_id, + 'isActive': assembly.is_active, + 'state': assembly.state } return jsonify(response) + + +@assembly_blueprint.post('/confirm') +def confirm_assembly(): + user_id = get_jwt_identity() + args: dict = request.json + assembly_id = args.get('assemblyId') + if not assembly_id or (not isinstance(assembly_id, int)): + response = { + 'ok': False, + 'message': 'ID сборки указан неверно' + } + return jsonify(response) + assembly = database.db.session.get(database.Assembly, assembly_id) + if not assembly: + response = { + 'ok': False, + 'message': 'Неудалось найти указанную сборку' + } + return jsonify(response) + if assembly.user_id != user_id: + response = { + 'ok': False, + 'message': 'Вы не можете закрыть сборку чужого пользователя' + } + return jsonify(response) + order_id = assembly.order_id + return sipro.api.orders.ship_order(order_id) + + +@assembly_blueprint.post('/updateState') +def update_assembly_state(): + try: + args = request.json + state = args.get('state') + assembly_id = args.get('assemblyId') + rows_to_update = [{ + 'id': assembly_id, + 'state': state + }] + database.db.session.bulk_update_mappings(database.Assembly, rows_to_update) + database.db.session.commit() + return jsonify(ok=True) + except Exception as e: + print('Error while updating') + return jsonify(ok=False) diff --git a/routes/orders.py b/routes/orders.py index d59ff0d..5344f59 100644 --- a/routes/orders.py +++ b/routes/orders.py @@ -10,8 +10,27 @@ def get_order(order_id: int): return jsonify(id=order_id) +@orders_blueprint.get('/getOrders') +def get_orders(): + args = request.args + order_by = args.get('orderBy') + desc = int(args.get('desc')) + page = int(args.get('page')) + shipment_date = args.get('shipmentDate') + status = args.get('status') + response = sipro.api.orders.get_orders(order_by, desc, page, shipment_date, status) + return jsonify(response) + + @orders_blueprint.get('/getBySupplierProductId') def get_orders_by_supplier_product_id(): args = request.args supplier_product_id = args.get('supplierProductId') return sipro.api.orders.get_orders_by_supplier_product_id(supplier_product_id) + + +@orders_blueprint.get('/getOrderById') +def get_order_by_id(): + args = request.args + order_id = args.get('orderId') + return sipro.api.orders.get_order_by_id(order_id) diff --git a/sipro/api/orders.py b/sipro/api/orders.py index 9fc3173..6db357e 100644 --- a/sipro/api/orders.py +++ b/sipro/api/orders.py @@ -8,3 +8,29 @@ def get_orders_by_supplier_product_id(supplier_product_id: str) -> list[dict]: method = f'{router}/getBySupplierProductId?supplierProductId={supplier_product_id}' response = client.method('GET', method) return response + + +def get_order_by_id(order_id) -> dict: + method = f'{router}/getOrderById?orderId={order_id}' + response = client.method('GET', method) + return response + + +def ship_order(order_id: int) -> dict: + method = f'{router}/shipOrder' + data = {'orderId': order_id} + response = client.method('POST', method, data=data) + return response + + +def close_order(order_id: int) -> dict: + method = f'{router}/closeOrder' + data = {'orderId': order_id} + response = client.method('POST', method, data=data) + return response + + +def get_orders(order_by: str, desc: int, page: int, shipment_date: str, status: str): + method = f'{router}/getOrders?orderBy={order_by}&desc={desc}&page={page}&shipmentDate={shipment_date}&status={status}' + response = client.method('GET', method) + return response