осталось немного дописать инициализацию БД и переходим к API

This commit is contained in:
2025-12-03 08:49:27 +03:00
parent f3213c696f
commit f378de38da
8 changed files with 98 additions and 27 deletions
+7 -1
View File
@@ -5,6 +5,7 @@ from .categories import *
from .stock import * from .stock import *
from .toolkit import * from .toolkit import *
from .records import * from .records import *
from .actions import *
class InitializeDatabase: class InitializeDatabase:
@@ -17,6 +18,7 @@ class InitializeDatabase:
self.toolkitHandler = ToolkitHandler() self.toolkitHandler = ToolkitHandler()
self.stocksRecordHandler = StocksRecordsHandler() self.stocksRecordHandler = StocksRecordsHandler()
self.servicesRecordHandler = ServiceRecordsHandler() self.servicesRecordHandler = ServiceRecordsHandler()
self.actionsHandler = StocksActions()
async def initialize(self): async def initialize(self):
await self.accessHandler.initialize() await self.accessHandler.initialize()
@@ -24,7 +26,7 @@ class InitializeDatabase:
await self.toolboxHandler.initialize() await self.toolboxHandler.initialize()
await self.categoryHandler.initialize() await self.categoryHandler.initialize()
await self.toolkitHandler.initialize() await self.toolkitHandler.initialize()
await self.stockHandler.initialize() await self.actionsHandler.initialize()
__all__ = [ __all__ = [
@@ -36,4 +38,8 @@ __all__ = [
"ToolkitHandler", "ToolkitHandler",
"StocksRecords", "StocksRecords",
"ServicesRecords", "ServicesRecords",
"StocksRecordsHandler",
"ServiceRecordsHandler",
"StocksActions",
"InitializeDatabase",
] ]
+1
View File
@@ -146,6 +146,7 @@ class AccessLevelHandler:
"available_own_toolbox": True, "available_own_toolbox": True,
}, },
} }
logger.info("Инициализация уровней доступа")
for accessLevel in baseAcessLevels.values(): for accessLevel in baseAcessLevels.values():
await self.add(**accessLevel) await self.add(**accessLevel)
+77 -21
View File
@@ -40,11 +40,21 @@ class StocksActions:
reason=reason, reason=reason,
quantity=quantity, quantity=quantity,
price=price, price=price,
return_record_id=True,
) )
logger.info( logger.info(
f"Оприходование инструмента {toolkit_id} на складе {toolbox_id} прошло {'успешно' if recorded else 'не успешно'}" f"Оприходование инструмента {toolkit_id} на складе {toolbox_id} прошло {'успешно' if recorded else 'не успешно'}"
) )
return recorded if recorded:
accepted = await StocksRecordsHandler.accept(
recorded, user_id, None, quantity, price
)
if not accepted:
logger.error(
f"Принятие записи о оприходовании инструмента {toolkit_id} на складе {toolbox_id} не удалось"
)
return accepted
return False
async def moving( async def moving(
action: str, action: str,
@@ -74,7 +84,7 @@ class StocksActions:
return False return False
totalTakeQuantity = 0 totalTakeQuantity = 0
writeDownLIst = [] writeDownList = []
for stock in availability: for stock in availability:
if quantity == totalTakeQuantity: if quantity == totalTakeQuantity:
@@ -99,7 +109,7 @@ class StocksActions:
) )
if not target_toolbox_id: if not target_toolbox_id:
writeDownLIst.append( writeDownList.append(
{ {
"id": sourceEdit["id"], "id": sourceEdit["id"],
"quantity": takeQuantity, "quantity": takeQuantity,
@@ -169,45 +179,45 @@ class StocksActions:
logger.info( logger.info(
f"{action} инструмента {toolkit_id} со склада {source_toolbox_id} на склад {target_toolbox_id} прошло успешно" f"{action} инструмента {toolkit_id} со склада {source_toolbox_id} на склад {target_toolbox_id} прошло успешно"
) )
return True if target_toolbox_id else writeDownLIst return True if target_toolbox_id else writeDownList
async def writeDownRequest( async def movingRequest(
action: str,
toolkit_id: int, toolkit_id: int,
toolbox_id: int, source_toolbox_id: int,
target_toolbox_id: int,
quantity: int, quantity: int,
reason: str, reason: str,
user_id: int, user_id: int,
price: int = 0, price: int = 0,
return_record_id: bool = False,
): ):
logger.info( logger.info(
f"Запрос на списание инструмента {toolkit_id} со склада {toolbox_id} в количестве {quantity} по цене {price} ..." f"Запрос на {action} инструмента {toolkit_id} со склада {source_toolbox_id} в количестве {quantity} по цене {price} ..."
) )
recorded = await StocksRecordsHandler.add( recorded = await StocksRecordsHandler.add(
action="Списание", action=action,
source_stock_id=None, source_stock_id=None,
target_stock_id=None, target_stock_id=None,
source_toolbox_id=toolbox_id, source_toolbox_id=source_toolbox_id,
target_toolbox_id=None, target_toolbox_id=target_toolbox_id,
toolkit_id=toolkit_id, toolkit_id=toolkit_id,
init_user_id=user_id, init_user_id=user_id,
reason=reason, reason=reason,
quantity=quantity, quantity=quantity,
price=price, price=price,
return_record_id=return_record_id,
) )
logger.info( logger.info(
f"Запрос на списание инструмента {toolkit_id} со склада {toolbox_id} в количестве {quantity} по цене {price} {'успешно завершен' if recorded else 'завершен с ошибкой'}" f"Запрос на {action} инструмента {toolkit_id} со склада {source_toolbox_id} в количестве {quantity} по цене {price} {'успешно завершен' if recorded else 'завершен с ошибкой'}"
) )
return recorded return recorded
async def writeDownAcceptance(self, record_id: int, user_id: int): async def movingAcceptance(self, record_id: int, user_id: int):
logger.info(f"Принятие записи о списании инструмента {record_id} ...") logger.info(f"Принятие записи о движении инструмента {record_id} ...")
writeDownARecord = await StocksRecordsHandler.getById(record_id, True) writeDownARecord = await StocksRecordsHandler.getById(record_id, True)
if not writeDownARecord: if not writeDownARecord:
return False logger.error(f"Запись {record_id} не найдена")
if writeDownARecord.action != "Списание":
logger.error(
f"Запись {record_id} не является записью о списании инструмента"
)
return False return False
if writeDownARecord.accepted_at is not None: if writeDownARecord.accepted_at is not None:
logger.error(f"Запись {record_id} уже была принята") logger.error(f"Запись {record_id} уже была принята")
@@ -222,7 +232,7 @@ class StocksActions:
reason=writeDownARecord.reason, reason=writeDownARecord.reason,
) )
if not stocksMovements: if not stocksMovements:
logger.error(f"Ошибка при списании инструмента") logger.error(f"Ошибка при {writeDownARecord.action} инструмента")
return False return False
accept = await StocksRecordsHandler.accept( accept = await StocksRecordsHandler.accept(
@@ -266,11 +276,57 @@ class StocksActions:
totalRecordsIds.append(recorded) totalRecordsIds.append(recorded)
logger.info( logger.info(
f"Записи {', '.join(map(str, totalRecordsIds))} о списании инструмента успешно приняты {user_id}" f"Записи {', '.join(map(str, totalRecordsIds))} о {writeDownARecord.action} инструмента успешно приняты {user_id}"
) )
return True return True
# TODO Дописать возврат на склад async def takeToolkit(
self,
source_toolbox_id: int,
target_toolbox_id: int,
toolkit_id: int,
quantity: int,
reason: str,
user_id: int,
price: int = 0,
):
logger.info(
f"Формирование запроса на получение инструмента {toolkit_id} на склад {target_toolbox_id} со склада {source_toolbox_id} в количестве {quantity} ..."
)
takeRequest = await self.movingRequest(
action="Получение",
source_toolbox_id=source_toolbox_id,
target_toolbox_id=target_toolbox_id,
toolkit_id=toolkit_id,
quantity=quantity,
user_id=user_id,
reason=reason,
price=price,
return_record_id=True,
)
if not takeRequest:
logger.error(
f"Формирование запроса на получение инструмента {toolkit_id} не удалось"
)
return False
logger.info(
f"Формирование запроса на получение инструмента {toolkit_id} успешно завершено"
)
logger.info(
f"Принятие запроса {takeRequest} на получение инструмента {toolkit_id} ..."
)
accepted = await self.movingAcceptance(takeRequest, user_id)
if not accepted:
logger.error(
f"Принятие запроса {takeRequest} на получение инструмента {toolkit_id} не удалось"
)
return False
logger.info(
f"Принятие запроса {takeRequest} на получение инструмента {toolkit_id} успешно завершено"
)
return True
async def initialize(): async def initialize():
# TODO прописать наполнение общих складов, получение на личные, возвраты и списания.
# Не все запросы на возвраты и списания нужно принять автоматически, нужно оставить несколько для демонстрации
pass pass
+1
View File
@@ -85,6 +85,7 @@ class CategoryHandler:
{"title": "Слесарка", "description": "Инструмент для слесарного цеха"}, {"title": "Слесарка", "description": "Инструмент для слесарного цеха"},
] ]
logger.info("Создание базовых категорий")
for categoryData in baseCategories: for categoryData in baseCategories:
await CategoryHandler.add(categoryData) await CategoryHandler.add(categoryData)
-3
View File
@@ -110,6 +110,3 @@ class StockHandler:
f"Запись об остатках {stockInfo} успешно обновлена, изменены данные: {kwargs.keys()}" f"Запись об остатках {stockInfo} успешно обновлена, изменены данные: {kwargs.keys()}"
) )
return editedStock.toDict() return editedStock.toDict()
async def initialize():
pass
+9 -1
View File
@@ -1,7 +1,7 @@
from utils import logger from utils import logger
from db import CRUD from db import CRUD
from db.schemas import Toolbox from db.schemas import Toolbox
from sqlalchemy import select from sqlalchemy import or_, select
from db.handlers import ServiceRecordsHandler from db.handlers import ServiceRecordsHandler
@@ -70,6 +70,13 @@ class ToolboxHandler:
return {} return {}
return toolbox.toDict() return toolbox.toDict()
async def getByOwner(ownerId: int) -> list:
query = select(Toolbox).where(
or_(Toolbox.owner_id == ownerId, Toolbox.owner_id == None)
)
toolboxes = await CRUD.read(query, True)
return [toolbox.toDict() for toolbox in toolboxes] if toolboxes else []
async def delete(toolboxId: int, user_id: int = None): async def delete(toolboxId: int, user_id: int = None):
query = select(Toolbox).where(Toolbox.id == toolboxId) query = select(Toolbox).where(Toolbox.id == toolboxId)
toolbox = await CRUD.read(query) toolbox = await CRUD.read(query)
@@ -106,6 +113,7 @@ class ToolboxHandler:
}, },
] ]
logger.info("Создание базовых тулбоксов")
for toolboxData in baseToolsboxes: for toolboxData in baseToolsboxes:
await ToolboxHandler.add(toolboxData) await ToolboxHandler.add(toolboxData)
+1
View File
@@ -158,6 +158,7 @@ class ToolkitHandler:
async def initialize(self): async def initialize(self):
from .categories import CategoryHandler from .categories import CategoryHandler
logger.info("Инициализация инструментов")
categoriesList = await CategoryHandler.getAll() categoriesList = await CategoryHandler.getAll()
categories = {category["title"]: category["id"] for category in categoriesList} categories = {category["title"]: category["id"] for category in categoriesList}
+2 -1
View File
@@ -185,6 +185,7 @@ class UserHandler:
async def initialize(self): async def initialize(self):
from .access import AccessLevelHandler from .access import AccessLevelHandler
logger.info("Инициализация пользователей")
accessLevelsList = await AccessLevelHandler.getAll() accessLevelsList = await AccessLevelHandler.getAll()
acessLevels = { acessLevels = {
accessLevel["title"]: accessLevel["id"] for accessLevel in accessLevelsList accessLevel["title"]: accessLevel["id"] for accessLevel in accessLevelsList
@@ -218,5 +219,5 @@ class UserHandler:
for user in baseUsers.values(): for user in baseUsers.values():
await self.add(user) await self.add(user)
logger.info("Инициализация модуля пользователей завершена") logger.info("Инициализация пользователей завершена")
return return