backend/batches/views.py

194 lines
7.9 KiB
Python
Raw Normal View History

2025-03-23 21:24:08 +10:00
import requests
from django.http import JsonResponse
from django.views import View
from django.conf import settings
import asyncio
import aiohttp
import json
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
# http://192.168.254.2/szkm/api/batch/load/eb7bb39a-fd68-47c7-aec8-0041a4fe5faf/
# Настройки API
API_BASE_URL = "http://192.168.254.2:8280/api"
API_REPORTS_URL = f"{API_BASE_URL}/productlinereport/list"
LOGIN_URL = f"{API_BASE_URL}/login"
BATCH_LIST_URL = f"{API_BASE_URL}/Batch/list"
# Данные для входа
USERNAME = "user"
PASSWORD = "user"
def get_auth_token():
"""Авторизуется и получает Bearer токен"""
response = requests.post(LOGIN_URL, json={"username": USERNAME, "password": PASSWORD})
if response.status_code == 200:
data = response.json()
token = data.get("Value", {}).get("Token") # Исправленный способ получения токена
if token:
return token
return None
class BatchListView(View):
"""Получает список партий с фильтрацией по CreatedOn"""
def get(self, request):
token = get_auth_token()
if not token:
return JsonResponse({"error": "Не удалось получить токен"}, status=401)
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
payload = {
"Filter": {
"Filters": [
{"Value": "2024-01-1 00:00:00", "Operator": "gte", "Field": "CreatedOn"},
{"Value": "2025.11.22", "Operator": "lte", "Field": "CreatedOn"}
],
"Logic": "and"
}
}
response = requests.post(BATCH_LIST_URL, json=payload, headers=headers)
if response.status_code == 200:
return JsonResponse(response.json(), safe=False)
return JsonResponse({"error": "Ошибка при запросе данных"}, status=response.status_code)
class BatchListGTIN(View):
"""Получает список партий с фильтрацией по CreatedOn"""
def get(self, request):
token = get_auth_token()
if not token:
return JsonResponse({"error": "Не удалось получить токен"}, status=401)
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
payload = {
"Filter": {
"Filters": [
{
"Filters": [
{
"Value": "04607017161371",
"Operator": "eq",
"Field": "ProductType.GTIN"
},
{
"Value": "04607017161371",
"Operator": "linq",
"Field": "CodesForProductLines.Any( a=> a.ProductType.GTIN=='{0}' )"
}
],
"Logic": "or"
}
],
"Logic": "and"
},
"Includes": [
"ProductType",
"CodesForProductLines.ProductType"
]
}
response = requests.post(BATCH_LIST_URL, json=payload, headers=headers)
if response.status_code == 200:
return JsonResponse(response.json(), safe=False)
return JsonResponse({"error": "Ошибка при запросе данных"}, status=response.status_code)
@method_decorator(csrf_exempt, name='dispatch')
class BatchListReport(View):
"""Получает список партий с фильтрацией по CreatedOn и BatchId из тела запроса"""
def post(self, request):
token = get_auth_token()
if not token:
return JsonResponse({"error": "Не удалось получить токен"}, status=401)
try:
body = json.loads(request.body)
batch_id = body.get("id")
except json.JSONDecodeError:
return JsonResponse({"error": "Неверный формат JSON"}, status=400)
if not batch_id:
return JsonResponse({"error": "Отсутствует параметр 'id'"}, status=400)
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
payload = {"skip":0,"take":10,"includes":["ProductLineBatch","ProductLineBatch.ProductType","ProductLine"],"sort":[{"field":"CreatedOn","dir":"desc"}],"filter":{"filters":[{"operator":"eq","field":"ProductLineBatchId","value":batch_id}],"logic":"and"}}
response = requests.post(API_REPORTS_URL, json=payload, headers=headers)
if response.status_code == 200:
return JsonResponse(response.json(), safe=False)
return JsonResponse({"error": "Ошибка при запросе данных"}, status=response.status_code)
class BatchReportView(View):
"""Получает список партий и прикрепляет к ним отчёты асинхронно."""
async def fetch_reports(self, session, headers, batch_id):
"""Асинхронно получает список отчётов для заданной партии."""
if not batch_id:
return []
report_payload = {
"Skip": 0,
"Take": 100000,
"Filter": {
"Field": "BatchId",
"Operator": "eq",
"Value": batch_id
},
"TotalCount": 0,
"Sort": [{"Field": "CreatedOn", "Dir": "desc"}]
}
async with session.post(API_REPORTS_URL, json=report_payload, headers=headers) as response:
if response.status == 200:
data = await response.json()
return data.get("Value", {}).get("Items", [])
return []
async def fetch_all_reports(self, batches, headers):
"""Запрашивает отчёты для всех партий параллельно."""
async with aiohttp.ClientSession() as session:
tasks = [self.fetch_reports(session, headers, batch.get("ProductTypeId")) for batch in batches]
reports = await asyncio.gather(*tasks)
# Присваиваем отчёты соответствующим партиям
for batch, report in zip(batches, reports):
batch["Reports"] = report
def get(self, request):
"""Основной метод обработки GET-запроса."""
token = get_auth_token()
if not token:
return JsonResponse({"error": "Не удалось получить токен"}, status=401)
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
# Запрос списка партий
batch_payload = {
"Filter": {
"Filters": [
{"Value": "2025-01-1 00:00:00", "Operator": "gte", "Field": "CreatedOn"},
{"Value": "2025.11.22", "Operator": "lte", "Field": "CreatedOn"}
],
"Logic": "and"
}
}
batch_response = requests.post(BATCH_LIST_URL, json=batch_payload, headers=headers)
if batch_response.status_code != 200:
return JsonResponse({"error": "Ошибка при запросе списка партий"}, status=batch_response.status_code)
batch_data = batch_response.json()
batches = batch_data.get("Value", {}).get("Items", [])
print(batches)
# Асинхронно получаем отчёты для всех партий
asyncio.run(self.fetch_all_reports(batches, headers))
print(fetch_all_reports)
return JsonResponse({"Batches": batches}, safe=False)