182 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import datetime
 | 
						||
 | 
						||
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('/create')
 | 
						||
def create_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': True,
 | 
						||
            'message': 'Сборка успешно запущена!',
 | 
						||
            'assemblyId': assembly.id,
 | 
						||
            'statusCode': 'CREATED'
 | 
						||
        }
 | 
						||
        return jsonify(response)
 | 
						||
    except Exception as e:
 | 
						||
        response = {
 | 
						||
            'ok': False,
 | 
						||
            'message': f'Неизвестная ошибка: {e}',
 | 
						||
            'assemblyId': -1,
 | 
						||
            'statusCode': 'INVALID_EXCEPTION'
 | 
						||
        }
 | 
						||
        return jsonify(response)
 | 
						||
 | 
						||
 | 
						||
@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.post('/cancel')
 | 
						||
def cancel_assembly():
 | 
						||
    try:
 | 
						||
        user_id = get_jwt_identity()
 | 
						||
        assembly = database.Assembly.query.filter(database.Assembly.user_id == user_id,
 | 
						||
                                                  database.Assembly.is_active == True).first()
 | 
						||
        if not assembly:
 | 
						||
            response = {
 | 
						||
                'ok': False,
 | 
						||
                'message': 'У вас нет активных сборок'
 | 
						||
            }
 | 
						||
            return jsonify(response)
 | 
						||
        database.db.session.delete(assembly)
 | 
						||
        database.db.session.commit()
 | 
						||
        response = {
 | 
						||
            'ok': True,
 | 
						||
            'message': 'Сборка успешно отменена!'
 | 
						||
        }
 | 
						||
        return jsonify(response)
 | 
						||
    except Exception as e:
 | 
						||
        response = {
 | 
						||
            'ok': False,
 | 
						||
            'message': f'Неизвестная ошибка: {e}'
 | 
						||
        }
 | 
						||
        return jsonify(response)
 | 
						||
 | 
						||
 | 
						||
@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 = {
 | 
						||
        '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)
 |