оптимизация работы с БД

This commit is contained in:
2025-12-06 13:48:42 +03:00
parent f07843de5a
commit 54bf21d52d
8 changed files with 80 additions and 63 deletions
+58 -36
View File
@@ -6,6 +6,7 @@ from db.handlers.user import UserHandler
from db.handlers.access import AccessLevelHandler
from db.handlers.records import StocksRecordsHandler
from db.schemas.records import StocksRecords
from utils import logger
@@ -47,7 +48,7 @@ class StocksActions:
reason=reason,
quantity=quantity,
price=price,
return_record_id=True,
return_record=True,
)
logger.info(
f"Оприходование инструмента {toolkit_id} на складе {toolbox_id} прошло {'успешно' if recorded else 'не успешно'}"
@@ -124,6 +125,9 @@ class StocksActions:
)
if not target_toolbox_id:
logger.warning(
f"Производится списание инструмента {toolkit_id} со склада {source_toolbox_id} в количестве {takeQuantity} по цене {stock['price']}"
)
continue
existing = await StockHandler.getByToolboxIdAndToolkitIdAndQPrice(
@@ -165,23 +169,23 @@ class StocksActions:
f"Изменение остатков инструмента {toolkit_id} на склад {target_toolbox_id} по цене {stock['price']} успешно завершено"
)
recorded = await StocksRecordsHandler.add(
action=action,
source_stock_id=stock["id"],
target_stock_id=targetStock.get("id"),
source_toolbox_id=source_toolbox_id,
target_toolbox_id=target_toolbox_id,
toolkit_id=toolkit_id,
init_user_id=user_id,
reason=reason,
quantity=quantity,
price=stock["price"],
)
if not recorded:
logger.error(
f"Ошибка создания записи о {action} инструмента {toolkit_id} со склада {source_toolbox_id} на склад {target_toolbox_id}"
)
return False
# recorded = await StocksRecordsHandler.add(
# action=action,
# source_stock_id=stock["id"],
# target_stock_id=targetStock.get("id"),
# source_toolbox_id=source_toolbox_id,
# target_toolbox_id=target_toolbox_id,
# toolkit_id=toolkit_id,
# init_user_id=user_id,
# reason=reason,
# quantity=quantity,
# price=stock["price"],
# )
# if not recorded:
# logger.error(
# f"Ошибка создания записи о {action} инструмента {toolkit_id} со склада {source_toolbox_id} на склад {target_toolbox_id}"
# )
# return False
logger.info(
f"{action} инструмента {toolkit_id} со склада {source_toolbox_id} на склад {target_toolbox_id} прошло успешно"
@@ -197,7 +201,7 @@ class StocksActions:
reason: str,
user_id: int,
price: int = 0,
return_record_id: bool = False,
return_record: bool = False,
):
logger.info(
f"Запрос на {action} инструмента {toolkit_id} со склада {source_toolbox_id} в количестве {quantity} по цене {price} ..."
@@ -213,18 +217,28 @@ class StocksActions:
reason=reason,
quantity=quantity,
price=price,
return_record_id=return_record_id,
return_record=return_record,
)
logger.info(
f"Запрос на {action} инструмента {toolkit_id} со склада {source_toolbox_id} в количестве {quantity} по цене {price} {'успешно завершен' if recorded else 'завершен с ошибкой'}"
)
return recorded
async def movingDecision(record_id: int, user_id: int, accepted: bool = True):
async def movingDecision(
record_id: int,
user_id: int,
accepted: bool = True,
record: StocksRecords = None,
):
logger.info(
f"{'Принятие' if accepted else 'Отклонение'} записи о движении инструмента {record_id} ..."
f"{'Принятие' if accepted else 'Отклонение'} записи {record_id if not record else record.id} о движении инструмента {'' if not record else record.toolkit_id} ..."
)
movingRecord = await StocksRecordsHandler.getById(record_id, True)
movingRecord = (
await StocksRecordsHandler.getById(record_id, True)
if not record
else record
)
if not movingRecord:
logger.error(f"Запись {record_id} не найдена")
return False
@@ -235,7 +249,7 @@ class StocksActions:
return False
if not accepted:
return await StocksRecordsHandler.decide(
record_id,
movingRecord,
user_id,
movingRecord.source_stock_id,
movingRecord.quantity,
@@ -264,7 +278,7 @@ class StocksActions:
return False
accept = await StocksRecordsHandler.decide(
record_id,
movingRecord,
user_id,
stocksMovements[0].get("id"),
stocksMovements[0].get("quantity"),
@@ -288,12 +302,12 @@ class StocksActions:
reason=movingRecord.reason,
quantity=stock.get("quantity"),
price=stock.get("price"),
return_record_id=True,
return_record=True,
)
if not recorded:
return False
accept = await StocksRecordsHandler.decide(
record_id=recorded,
record=recorded,
decision_user_id=user_id,
source_stock_id=stock.get("id"),
quantity=stock.get("quantity"),
@@ -329,7 +343,7 @@ class StocksActions:
user_id=user_id,
reason=reason,
price=price,
return_record_id=True,
return_record=True,
)
if not takeRequest:
logger.error(
@@ -340,16 +354,16 @@ class StocksActions:
f"Формирование запроса на получение инструмента {toolkit_id} успешно завершено"
)
logger.info(
f"Принятие запроса {takeRequest} на получение инструмента {toolkit_id} ..."
f"Принятие запроса {takeRequest.id} на получение инструмента {toolkit_id} ..."
)
accepted = await StocksActions.movingDecision(takeRequest, user_id)
accepted = await StocksActions.movingDecision(None, user_id, record=takeRequest)
if not accepted:
logger.error(
f"Принятие запроса {takeRequest} на получение инструмента {toolkit_id} не удалось"
f"Принятие запроса {takeRequest.id} на получение инструмента {toolkit_id} не удалось"
)
return False
logger.info(
f"Принятие запроса {takeRequest} на получение инструмента {toolkit_id} успешно завершено"
f"Принятие запроса {takeRequest.id} на получение инструмента {toolkit_id} успешно завершено"
)
return True
@@ -498,7 +512,7 @@ class StocksActions:
quantity=random.randint(3, 5),
reason=f"{action} инструмента {toolkit.get('title')}. После выполнения заказа",
user_id=user.get("id"),
return_record_id=True,
return_record=True,
)
if not success:
logger.error(
@@ -522,6 +536,7 @@ class StocksActions:
"manager": {"accept": [], "reject": [], "ignore": []},
"storekeeper": {"accept": [], "reject": [], "ignore": []},
}
logger.info("Разбивка списоков запросов ...")
for recordsList in requestsDict.values():
managerList, storekeeperList = (
recordsList[: len(recordsList) // 2],
@@ -550,9 +565,12 @@ class StocksActions:
storekeeperList[len(storekeeperList) // 3 * 2 :],
)
logger.warning("Применение решений ...")
for role in decisionsDict.keys():
logger.warning(f"Принятие записей пользователем {role} ...")
user_id = usersDict.get(role)
for decision in decisionsDict.get(role).keys():
logger.warning(f"Принятие решения {decision} пользователем {role} ...")
match decision:
case "accept":
accepted = True
@@ -560,15 +578,19 @@ class StocksActions:
accepted = False
case "ignore":
continue
for record_id in decisionsDict.get(role).get(decision):
for record in decisionsDict.get(role).get(decision):
logger.info(
f"{'Принятие' if accepted else 'Отклонение'} записи {record.id} пользователем {role} ... "
)
success = await StocksActions.movingDecision(
record_id=record_id,
record_id=None,
user_id=user_id,
accepted=accepted,
record=record,
)
if not success:
logger.error(
f"Принятие записи {record_id} пользователем {role} не удалось"
f"{'Принятие' if accepted else 'Отклонение'} записи {record.id} пользователем {role} не удалось"
)
return False