Parcourir la source

获取出库托盘

flower_mr il y a 1 mois
Parent
commit
0ac6a59b0b

BIN
bin/__pycache__/models.cpython-38.pyc


+ 25 - 0
bin/migrations/0002_devicemodel_mode_devicemodel_warehouse_code.py

@@ -0,0 +1,25 @@
+# Generated by Django 4.1.2 on 2025-04-25 14:59
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('bin', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='devicemodel',
+            name='mode',
+            field=models.CharField(default='inbound', max_length=255, verbose_name='Mode'),
+        ),
+        migrations.AddField(
+            model_name='devicemodel',
+            name='warehouse_code',
+            field=models.CharField(default=django.utils.timezone.now, max_length=255, verbose_name='Warehouse Code'),
+            preserve_default=False,
+        ),
+    ]

BIN
bin/migrations/__pycache__/0002_devicemodel_mode_devicemodel_warehouse_code.cpython-38.pyc


+ 37 - 0
bin/models.py

@@ -879,12 +879,14 @@ class LocationContainerLink(models.Model):
   
 
 class DeviceModel(models.Model):
+    warehouse_code = models.CharField(max_length=255, verbose_name="Warehouse Code")
     location = models.ForeignKey(LocationModel, on_delete=models.CASCADE)
     device_id = models.CharField(max_length=255, verbose_name="Device ID")
     device_name = models.CharField(max_length=255, verbose_name="Device Name")
     device_type = models.CharField(max_length=255, verbose_name="Device Type")
     ip_address = models.CharField(max_length=255, verbose_name="IP Address")
     port = models.IntegerField(verbose_name="Port")
+    mode = models.CharField(default='inbound', max_length=255, verbose_name="Mode")
     status = models.CharField(max_length=255, verbose_name="Status")
     create_time = models.DateTimeField(auto_now_add=True, verbose_name="Create Time")
     update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="Update Time")
@@ -894,6 +896,41 @@ class DeviceModel(models.Model):
         verbose_name_plural = "Device"
         ordering = ['-id']
         unique_together = ( 'location', 'device_id')  # 防止重复设备
+    @classmethod
+    def generate_device(cls,warehouse_code):
+        cls.objects.filter(warehouse_code=warehouse_code).delete()
+          # 输送机
+        location = LocationModel.objects.get(warehouse_code=warehouse_code, row=16, col=1, layer=1)
+        # 创建库位
+        cls.objects.update_or_create(
+            warehouse_code=warehouse_code,
+            location=location,
+            device_id=f"203",
+            device_name=f"203",
+            device_type='输送机',
+            ip_address='192.168.18.1',
+            mode = 'inbound',
+            port=203,
+            status='available',
+
+        )
+        location = LocationModel.objects.get(warehouse_code=warehouse_code, row=16, col=18, layer=1)
+        # 创建库位
+        cls.objects.update_or_create(
+            warehouse_code=warehouse_code,
+            location=location,
+            device_id=f"103",
+            device_name=f"103",
+            device_type='输送机',
+            ip_address='192.168.18.1',
+            mode = 'outbound',
+            port=103,
+            status='available',
+
+        )
+                    
+
+        
 # 库位变更记录(历史追溯)
 
 class LocationChangeLog(models.Model):

BIN
container/__pycache__/urls.cpython-38.pyc


BIN
container/__pycache__/views.cpython-38.pyc


+ 3 - 0
container/urls.py

@@ -33,4 +33,7 @@ re_path(r'^task/(?P<pk>\d+)/$', views.TaskViewSet.as_view({
 path(r'container_wcs/', views.ContainerWCSViewSet.as_view({"get": "get_container_wcs","put": "update_container_wcs"}), name='ContainerWCS'),
 re_path(r'container_wcs/update/', views.ContainerWCSViewSet.as_view({"get": "update_container_wcs"}), name='ContainerWCS1'),
 
+path(r'out_task/', views.OutTaskViewSet.as_view({"get": "get_out_task", "post": "create"}), name='OutTask'),
+
+path(r'batch/', views.BatchViewSet.as_view({"post": "wcs_post"}), name="Batch"),
 ]

+ 186 - 3
container/views.py

@@ -7,14 +7,17 @@ from django_filters.rest_framework import DjangoFilterBackend
 from rest_framework.response import Response
 from rest_framework.exceptions import APIException
 from django.utils import timezone
+import requests
+import json
+from django.conf import settings
 
 from django.db import transaction
 import logging
 from rest_framework import status
 from .models import ContainerListModel,ContainerDetailModel,ContainerOperationModel,ContainerWCSModel,TaskModel
-from bound.models import BoundBatchModel,BoundDetailModel,BoundListModel
+from bound.models import BoundBatchModel,BoundDetailModel,BoundListModel,OutBoundDetailModel
 from bin.views import LocationAllocation
-from bin.models import LocationModel
+from bin.models import LocationModel,LocationContainerLink
 # from .files import FileListRenderCN, FileDetailRenderCN
 
 from .serializers import ContainerDetailGetSerializer,ContainerDetailPostSerializer
@@ -790,4 +793,184 @@ class ContainerOperateViewSet(viewsets.ModelViewSet):
         headers = self.get_success_headers(serializer.data)
         return Response(serializer.data, status=200, headers=headers)
 
-        
+class OutTaskViewSet(viewsets.ModelViewSet):
+
+    """
+    # fun:get_out_task:下发出库任务
+    # fun:get_batch_count_by_boundlist:获取出库申请下的批次数量
+    """
+
+    # authentication_classes = []  # 禁用所有认证类
+    # permission_classes = [AllowAny]  # 允许任意访问
+
+    def get_out_task(self, request, *args, **kwargs):
+        try:
+            data = self.request.data
+            logger.info(f"收到 WMS 推送数据: {data}")
+            send_data= {
+                "container": "12345",
+                "current_location": "in1",
+                "month": 202503,
+                "current_location": "W01-01-01-01",
+                "target_location": "W01-01-01-01",
+                "tasktype": "inbound",
+                "taskid": "inbound-202503-0001",
+                "message": "生成入库任务",
+                "status": 103
+            }
+            post_json_to_url("http://127.0.0.1:8008/container/batch/", send_data)
+            return Response({"code": "200", "msg": "Success"}, status=200)
+        except Exception as e:
+            return Response({"code": "500", "msg": str(e)}, status=500)
+
+    def get_batch_count_by_boundlist(self,bound_list_id):
+        try:
+            bound_list_obj_all = OutBoundDetailModel.objects.filter(bound_list=bound_list_id).all()
+            if bound_list_obj_all:
+                logger.info(f"查询批次数量成功: {bound_list_obj_all.count()}")
+                batch_count_dict = {}
+                # 统计批次数量(创建哈希表,去重)
+                for batch in bound_list_obj_all:
+                    if batch.bound_batch_number_id not in batch_count_dict:
+                        batch_count_dict[batch.bound_batch_number_id] = batch.bound_batch.goods_out_qty
+                    else:
+                        batch_count_dict[batch.bound_batch_number_id] += batch.bound_batch.goods_out_qty
+                return batch_count_dict
+            else:
+                logger.error(f"查询批次数量失败: {bound_list_id} 不存在")
+                return {}
+        except Exception as e:
+            logger.error(f"查询批次数量失败: {str(e)}")
+            return {}
+
+
+    def get_location_by_status_and_batch(self,status,bound_id):
+        try:
+            container_obj = ContainerDetailModel.objects.filter(batch=bound_id,status=status).all()
+            if container_obj:
+                logger.info(f"查询{status}状态的批次数量成功: {container_obj.count()}")
+                container_dict = {}
+                # 统计托盘数量(创建哈希表,去重)
+                for obj in container_obj:
+                    if obj.container_id not in container_dict:
+                        container_dict[obj.container_id] = obj.goods_qty
+                    else:
+                        container_dict[obj.container_id] += obj.goods_qty
+                return container_dict
+            else:
+                logger.error(f"查询{status}状态的批次数量失败: {bound_id} 不存在")
+                return {}
+        except Exception as e:
+            logger.error(f"查询{status}状态的批次数量失败: {str(e)}")
+            return {}
+    def get_order_by_batch(self,container_list):
+        try:
+            container_dict = {}
+            for container in container_list:
+               location_container = LocationContainerLink.objects.filter(container_id=container,is_active=True).first()
+               if location_container:
+                   location_c_number = location_container.location.c_number
+                   if container not in container_dict:
+                        container_dict[container] = {
+                            "container_number":container,
+                            "location_c_number":location_c_number,
+                            "location_id ":location_container.location.id,
+                            "location_type":location_container.location.location_type
+                            }
+
+            if len(container_dict.keys()) == len(container_list):
+                return container_dict
+            else:
+                logger.error(f"查询批次数量失败: {container_list} 不存在")
+                return {}
+        except Exception as e:
+            logger.error(f"查询批次数量失败: {str(e)}")
+            return {}
+                   
+
+        except Exception as e:
+            logger.error(f"查询{status}状态的批次数量失败: {str(e)}")
+            return {}
+
+    def generate_location_by_demand(self,demand_list):
+        # demand_list {1: 25, 2: 17}
+        try:
+            return_location =[]
+            for demand_id, demand_qty in demand_list.items():
+                container_list = self.get_location_by_status_and_batch(1, demand_id)
+                if not container_list:
+                    return {"code": "500", "msg": f"批次 {demand_id} 不存在"}
+                container_id_list = container_list.keys()
+                container_order = self.get_order_by_batch(container_id_list) 
+                if not container_order:
+                    return {"code": "500", "msg": f"托盘 {container_id_list} 不存在"}
+                order = sorted(
+                        container_order.values(),
+                        key=lambda x: (
+                            int(x['location_type'][-1]),  # 提取最后一位数字并转为整数
+                            -x['location_c_number']       # 按location_c_number降序
+                        )
+                    )
+                current_qty = 0
+                for container in order:
+                    container_detail_obj = ContainerDetailModel.objects.filter(container_id=container['container_number'],batch_id=demand_id,status=1).all()
+                    if not container_detail_obj:
+                        return {"code": "500", "msg": f"托盘上无该批次,请检查{container['container_number']} 不存在"}
+                    goods_qty = 0 
+                    for obj in container_detail_obj:
+                        goods_qty += obj.goods_qty
+                    if current_qty < demand_qty:
+                        current_qty += goods_qty
+                        return_location.append(container)
+                    else:
+                        break
+            return {"code": "200", "msg": "Success", "data": return_location}
+        except Exception as e:
+            return {"code": "500", "msg": str(e)}
+
+    
+
+
+class BatchViewSet(viewsets.ModelViewSet):
+    authentication_classes = []  # 禁用所有认证类
+    permission_classes = [AllowAny]  # 允许任意访问
+
+    def wcs_post(self, request, *args, **kwargs):
+        data = self.request.data
+        logger.info(f"收到 WMS 推送数据: {data}")
+        return Response({"code": "200", "msg": "Success"}, status=200)
+
+def post_json_to_url(url, data):
+    """
+    发送 JSON 数据到指定 URL
+    :param url: 目标地址 (e.g., "https://api.example.com/endpoint")
+    :param data: 要发送的字典数据 (e.g., {"key": "value"})
+    :return: 响应内容 (字典) 或错误信息
+    """
+    headers = {
+        'Content-Type': 'application/json',
+        # 可选:添加认证头 (如 Token)
+        # 'Authorization': f'Bearer {settings.API_TOKEN}'
+    }
+
+    try:
+        # 发送 POST 请求
+        response = requests.post(
+            url,
+            data=json.dumps(data),  # 序列化为 JSON 字符串
+            headers=headers,
+            timeout=10  # 超时时间(秒)
+        )
+
+        # 检查 HTTP 状态码
+        response.raise_for_status()
+
+        # 解析 JSON 响应
+        return response.json()
+
+    except requests.exceptions.RequestException as e:
+        # 处理网络错误、超时等
+        return {"error": str(e)}
+    except json.JSONDecodeError:
+        # 处理响应非 JSON 格式的情况
+        return {"error": "Invalid JSON response"}

+ 36 - 0
data_base/generate_location_group copy.py

@@ -0,0 +1,36 @@
+# generate_locations.py
+import os
+import django
+import sys
+
+def setup_django():
+    # 使用原始字符串处理Windows路径
+    project_path = "D:/Document/code/vue/greater_wms"
+    sys.path.append(project_path)
+    
+    # 根据实际目录名设置(注意下划线)
+    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'greaterwms.settings')
+    django.setup()
+
+def main():
+    try:
+        # 从正确的应用导入模型
+        from bin.models import DeviceModel
+        
+        warehouse_code = "W01"
+        print(f"开始生成库位,仓库编码:{warehouse_code}")
+        
+        # 调用生成方法
+        DeviceModel.generate_device(warehouse_code)
+        
+        print("✅ 库位生成成功!")
+        print(f"共生成库位数:{DeviceModel.objects.count()}条")
+        
+    except Exception as e:
+        print(f"❌ 生成失败:{str(e)}")
+        import traceback
+        traceback.print_exc()
+
+if __name__ == "__main__":
+    setup_django()
+    main()

+ 75 - 0
data_base/out_task.py

@@ -0,0 +1,75 @@
+# generate_locations.py
+import os
+import django
+import sys
+
+# fun:get_pallet_count_by_batch: 根据托盘码查询批次下托盘总数
+# fun:get_location_type: 根据托盘数目获取库位类型
+# fun:updata_location_container_link: 更新库位和托盘的关联关系
+# fun:get_batch_status: 获取批次状态
+# fun:get_batch: 获取批次
+# fun:get_location_list_remainder: 获取可用库位的c_number列表
+# fun:get_min_list_index: 获取最小的库位
+# fun:get_location_by_type_remainder: 根据库位类型获取库位
+# fun:get_location_by_type: 第一次入库,根据库位类型获取库位
+# fun:get_location_by_status: 根据库位状态获取库位
+def setup_django():
+    # 使用原始字符串处理Windows路径
+    project_path = "D:/Document/code/vue/greater_wms"
+    sys.path.append(project_path)
+    
+    # 根据实际目录名设置
+    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'greaterwms.settings')
+    django.setup()
+
+def main():
+
+    from container.views import OutTaskViewSet
+
+    testtask = OutTaskViewSet()
+
+    count =testtask.get_batch_count_by_boundlist("2")
+    if not count:
+        print("❌ 批次下没有可用的库位,请检查批次号")
+        return
+    print(f"[1]批次下可用的库位数:{count}")
+    location_demand = testtask.generate_location_by_demand(count)
+    if not location_demand:
+        print("❌ 库位需求生成失败,请检查托盘编码")
+        return
+    print(f"[2]库位需求:{location_demand}")
+    # for demand_id, demand_qty in count.items():
+    #     print (f"需求{demand_id}的库位数:{demand_qty}")
+
+    #     container_list = testtask.get_location_by_status_and_batch(1,demand_id)
+    #     if not container_list:
+    #         print("❌ 库位获取失败,请检查托盘编码")
+    #         return
+    #     print(f"[2]库位:{container_list}")
+    #     # container_list是dict
+    #     container_id_list = container_list.keys()
+    #     print(f"[3]库位id列表:{container_id_list}")
+    #     print("✅ 方法生成成功!")
+
+    #     container_order = testtask.get_order_by_batch(container_id_list)
+    #     if not container_order:
+    #         print("❌ 订单获取失败,请检查托盘编码")
+    #         return
+    #     print(f"[4]订单:{container_order}")
+    #     # 根据container_order(dict)的值进行排序
+    #     sorted_order = sorted(
+    #         container_order.values(),
+    #         key=lambda x: (
+    #             int(x['location_type'][-1]),  # 提取T后的数字并转为整数
+    #             -x['location_c_number']       # 按location_c_number降序
+    #         )
+    #     )
+
+    #     print(f"[5]排序后的订单:{sorted_order}")
+
+
+
+
+if __name__ == "__main__":
+    setup_django()
+    main()

BIN
db.sqlite3


+ 210 - 0
logs/error.log

@@ -4239,3 +4239,213 @@ Traceback (most recent call last):
   File "D:\Document\code\vue\greater_wms\.\bound\views.py", line 382, in create
     data['bound_batch_number'] = OutBatchModel.objects.get(id=data['bound_batch']).bound_number
 AttributeError: 'OutBatchModel' object has no attribute 'bound_number'
+[2025-04-25 00:01:39,641][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-04-25 00:02:56,945][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-04-25 00:03:24,880][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-04-25 00:04:27,869][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-04-25 00:06:00,194][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-04-25 00:11:06,701][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'

+ 213 - 0
logs/server.log

@@ -6376,3 +6376,216 @@ Traceback (most recent call last):
   File "D:\Document\code\vue\greater_wms\.\bound\views.py", line 382, in create
     data['bound_batch_number'] = OutBatchModel.objects.get(id=data['bound_batch']).bound_number
 AttributeError: 'OutBatchModel' object has no attribute 'bound_number'
+[2025-04-25 00:01:39,641][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-04-25 00:02:56,945][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-04-25 00:03:24,880][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-04-25 00:04:27,869][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-04-25 00:06:00,194][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-04-25 00:11:06,701][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-04-25 00:18:09,431][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-25 13:39:35,238][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-25 14:47:56,577][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/

BIN
utils/__pycache__/throttle.cpython-38.pyc


+ 1 - 1
utils/throttle.py

@@ -10,7 +10,7 @@ class VisitThrottle(BaseThrottle):
     def allow_request(self, request, view):
         if request.path in ['/api/docs/', '/api/debug/', '/api/']:
             return (False, None)
-        elif request.path in ['/container/container_wcs/','/container/container_wcs/update/']:
+        elif request.path in ['/container/container_wcs/','/container/container_wcs/update/','/container/batch/']:
             return True
         else:
             ip = request.META.get('HTTP_X_FORWARDED_FOR') if request.META.get(