backend/batches/views.py

194 lines
7.9 KiB
Python
Raw Permalink Normal View History

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)