Browse Source

和wcs完成初步协同

flower_mr 3 months ago
parent
commit
b98ee80cda

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


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


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


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


+ 27 - 4
container/migrations/0001_initial.py

@@ -1,4 +1,4 @@
-# Generated by Django 4.1.2 on 2025-03-29 13:32
+# Generated by Django 4.1.2 on 2025-03-30 13:24
 
 from django.db import migrations, models
 import django.db.models.deletion
@@ -9,7 +9,7 @@ class Migration(migrations.Migration):
     initial = True
 
     dependencies = [
-        ('bound', '0001_initial'),
+        ('bound', '0002_bounddetailmodel_status'),
     ]
 
     operations = [
@@ -19,6 +19,7 @@ class Migration(migrations.Migration):
                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('container_code', models.IntegerField(verbose_name='托盘编号')),
                 ('current_location', models.CharField(default='N/A', max_length=50, verbose_name='当前库位')),
+                ('target_location', models.CharField(default='N/A', max_length=50, verbose_name='目标库位')),
                 ('status', models.IntegerField(choices=[(0, '空置'), (1, '入库中'), (2, '在库'), (3, '出库中'), (4, '已出库')], default=0, verbose_name='托盘状态')),
                 ('last_operation', models.DateTimeField(auto_now=True, verbose_name='最后操作时间')),
             ],
@@ -29,11 +30,33 @@ class Migration(migrations.Migration):
                 'ordering': ['-container_code'],
             },
         ),
+        migrations.CreateModel(
+            name='ContainerWCSModel',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('taskid', models.CharField(max_length=50, verbose_name='任务ID')),
+                ('month', models.IntegerField(verbose_name='月份')),
+                ('tasktype', models.CharField(max_length=50, verbose_name='任务类型')),
+                ('container', models.CharField(max_length=50, verbose_name='托盘号')),
+                ('current_location', models.CharField(max_length=50, verbose_name='当前库位')),
+                ('target_location', models.CharField(max_length=50, verbose_name='目标库位')),
+                ('message', models.TextField(verbose_name='消息')),
+                ('status', models.IntegerField(verbose_name='状态')),
+                ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
+                ('is_delete', models.BooleanField(default=False, verbose_name='是否删除')),
+            ],
+            options={
+                'verbose_name': 'ContainerWCS',
+                'verbose_name_plural': 'ContainerWCS',
+                'db_table': 'container_wcs',
+                'ordering': ['-create_time'],
+            },
+        ),
         migrations.CreateModel(
             name='ContainerOperationModel',
             fields=[
                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('month', models.IntegerField(max_length=20, verbose_name='月份')),
+                ('month', models.IntegerField(verbose_name='月份')),
                 ('operation_type', models.CharField(choices=[('inbound', '入库'), ('outbound', '出库')], max_length=20, verbose_name='操作类型')),
                 ('goods_code', models.CharField(max_length=50, verbose_name='货品编码')),
                 ('goods_desc', models.CharField(max_length=100, verbose_name='货品描述')),
@@ -58,7 +81,7 @@ class Migration(migrations.Migration):
             name='ContainerDetailModel',
             fields=[
                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('month', models.IntegerField(max_length=20, verbose_name='月份')),
+                ('month', models.IntegerField(verbose_name='月份')),
                 ('goods_code', models.CharField(max_length=50, verbose_name='货品编码')),
                 ('goods_desc', models.CharField(max_length=100, verbose_name='货品描述')),
                 ('goods_qty', models.IntegerField(verbose_name='数量')),

+ 0 - 23
container/migrations/0002_alter_containerdetailmodel_month_and_more.py

@@ -1,23 +0,0 @@
-# Generated by Django 4.1.2 on 2025-03-29 13:33
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('container', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='containerdetailmodel',
-            name='month',
-            field=models.IntegerField(verbose_name='月份'),
-        ),
-        migrations.AlterField(
-            model_name='containeroperationmodel',
-            name='month',
-            field=models.IntegerField(verbose_name='月份'),
-        ),
-    ]

BIN
container/migrations/__pycache__/0001_initial.cpython-38.pyc


+ 33 - 0
container/models.py

@@ -13,6 +13,7 @@ class ContainerListModel(models.Model):
    
     container_code = models.IntegerField( verbose_name='托盘编号')
     current_location = models.CharField(max_length=50, verbose_name='当前库位', default='N/A')
+    target_location = models.CharField(max_length=50, verbose_name='目标库位', default='N/A')
     status = models.IntegerField(choices=CONTAINER_STATUS, default=0, verbose_name='托盘状态')
     last_operation = models.DateTimeField(auto_now=True, verbose_name='最后操作时间')
 
@@ -69,3 +70,35 @@ class ContainerOperationModel(models.Model):
         verbose_name = 'ContainerOperation'
         verbose_name_plural = "ContainerOperation"
         ordering = ['-timestamp']
+
+class ContainerWCSModel(models.Model):
+    taskid = models.CharField(max_length=50, verbose_name='任务ID')
+    month = models.IntegerField(verbose_name='月份')
+    tasktype = models.CharField(max_length=50, verbose_name='任务类型')
+    container = models.CharField(max_length=50, verbose_name='托盘号')
+    current_location = models.CharField(max_length=50, verbose_name='当前库位')
+    target_location = models.CharField(max_length=50, verbose_name='目标库位')
+    message = models.TextField(verbose_name='消息')
+    status = models.IntegerField(verbose_name='状态')
+
+    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
+    is_delete = models.BooleanField(default=False, verbose_name='是否删除')
+
+    class Meta:
+        db_table = 'container_wcs'
+        verbose_name = 'ContainerWCS'
+        verbose_name_plural = "ContainerWCS"
+        ordering = ['-create_time']
+    
+    def to_dict(self):
+        return {
+            'container': self.container,
+            'current_location': self.current_location,
+            'month' : self.month,
+            'target_location': self.target_location,
+            'tasktype': self.tasktype,
+            'taskid': self.taskid,
+            'message': self.message,
+            'container': self.container,
+            'status': self.status
+        }

+ 2 - 0
container/serializers.py

@@ -10,6 +10,7 @@ class ContainerListGetSerializer(serializers.ModelSerializer):
     # 定义主单列表的序列化器,用于获取操作,字段只读
     container_code = serializers.IntegerField(read_only=True, required=False)
     current_location = serializers.CharField(read_only=True, required=False)
+    target_location = serializers.CharField(read_only=True, required=False)
     status = serializers.IntegerField(read_only=True, required=False)
     last_operation = serializers.DateTimeField(read_only=True, format='%Y-%m-%d', required=False)
 
@@ -23,6 +24,7 @@ class ContainerListPostSerializer(serializers.ModelSerializer):
     # 定义主单列表的序列化器,用于创建操作,允许部分字段写入
     container_code = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
     current_location = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
+    target_location = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
     status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
     last_operation = serializers.DateTimeField(read_only=False, format='%Y-%m-%d', required=False, validators=[datasolve.data_validate])
 

+ 2 - 0
container/urls.py

@@ -16,4 +16,6 @@ re_path(r'^detail/(?P<pk>\d+)/$', views.ContainerDetailViewSet.as_view({
     'patch': 'partial_update',
 }), name="ContainerDetail_1"),
 
+path(r'container_wcs/', views.ContainerWCSViewSet.as_view({"get": "get_container_wcs"}), name='ContainerWCS'),
+
 ]

+ 75 - 4
container/views.py

@@ -9,7 +9,7 @@ from rest_framework.exceptions import APIException
 from django.utils import timezone
 
 
-from .models import ContainerListModel,ContainerDetailModel,ContainerOperationModel
+from .models import ContainerListModel,ContainerDetailModel,ContainerOperationModel,ContainerWCSModel
 from bound.models import BoundBatchModel,BoundDetailModel,BoundListModel
 
 # from .files import FileListRenderCN, FileDetailRenderCN
@@ -55,9 +55,9 @@ class ContainerListViewSet(viewsets.ModelViewSet):
         id = self.get_project()
         if self.request.user:
             if id is None:
-                return ContainerListModel.objects.filter( is_delete=False)
+                return ContainerListModel.objects.filter()
             else:
-                return ContainerListModel.objects.filter( id=id, is_delete=False)
+                return ContainerListModel.objects.filter( id=id)
         else:
             return ContainerListModel.objects.none()
 
@@ -92,6 +92,77 @@ class ContainerListViewSet(viewsets.ModelViewSet):
         headers = self.get_success_headers(serializer.data)
         return Response(serializer.data, status=200, headers=headers)
 
+class ContainerWCSViewSet(viewsets.ModelViewSet):
+    """
+        retrieve:
+            Response a data list(get)
+            list:
+            Response a data list(all)
+        create:
+            Create a data line(post)
+
+        delete:
+            Delete a data line(delete)
+
+    """
+    authentication_classes = []  # 禁用所有认证类
+    permission_classes = [AllowAny]  # 允许任意访问
+ 
+
+    
+    def get_container_wcs(self, request, *args, **kwargs):
+        data = self.request.data
+        container = data.get('container_number')
+        current_location = data.get('current_location')
+        container_obj = ContainerListModel.objects.filter(container_code=container).first()
+        data_tosave = {}
+        if container_obj:
+            print('托盘编码存在', container_obj.id)
+            data['container'] = container
+            print('托盘编码存储', data['container'])
+            if container_obj.current_location == container_obj.target_location:
+                data['message'] = '当前位置已是目标位置'
+            else:
+                current_task = ContainerWCSModel.objects.filter(container=container, tasktype='inbound').first()
+                if current_task:
+                    data['message'] = '当前任务已存在,再次下发'
+                    data_return={
+                        'code':'200',
+                        'message':data['message'],
+                        'data':current_task.to_dict()
+                    }
+                else:
+                    data_tosave['container'] = container
+                    data_tosave['current_location'] = current_location
+                    data_tosave['month'] = str(timezone.now().strftime('%Y%m'))
+                    data_tosave['target_location']=container_obj.target_location
+                    data_tosave['tasktype'] = 'inbound'
+                    container_obj_month = ContainerWCSModel.objects.filter( month=data_tosave['month']).all()
+                    if container_obj_month:
+                        data_tosave['taskid'] = data_tosave['tasktype']+'-'+data_tosave['month']+'-'+str(container_obj_month.count()+1).zfill(4)
+                    else:
+                        data_tosave['taskid'] = data_tosave['tasktype']+'-'+data_tosave['month']+'-0001'
+                    data_tosave['message'] = '生成入库任务'
+                    data_tosave['container'] = container
+                    data_tosave['status'] = 103
+                    data_return={
+                        'code':'200',
+                        'message':data_tosave['message'],
+                        'data':data_tosave
+                    }
+                    ContainerWCSModel.objects.create(**data_tosave)
+                    print('入库任务创建成功', data_tosave['taskid'])
+           
+        else:
+            print('托盘编码不存在')
+            data_return={
+                'code':'400',
+                'message':'托盘编码不存在',
+                'data':data
+            }
+        return Response(data_return)
+
+
 class ContainerDetailViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -278,7 +349,7 @@ class ContainerOperationViewSet(viewsets.ModelViewSet):
     
     pagination_class = MyPageNumberPagination   
     filter_backends = [DjangoFilterBackend, OrderingFilter, ]
-    ordering_fields = ['id', "create_time", "update_time", ]
+    ordering_fields = ['id', "timestamp" ]
     filter_class = ContainerOperationFilter
 
     def get_project(self):

BIN
db.sqlite3


+ 686 - 0
logs/error.log

@@ -667,3 +667,689 @@ Traceback (most recent call last):
   File "D:\Document\code\vue\greater_wms\.\container\views.py", line 204, in create
     continue
 NameError: name 'goods_code' is not defined
+[2025-03-30 09:44:44,209][django.request.log_response():241] [ERROR] Internal Server Error: /container/list/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\mixins.py", line 38, in list
+    queryset = self.filter_queryset(self.get_queryset())
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 58, in get_queryset
+    return ContainerListModel.objects.filter( is_delete=False)
+  File "d:\language\python38\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
+    return getattr(self.get_queryset(), name)(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1420, in filter
+    return self._filter_or_exclude(False, args, kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1438, in _filter_or_exclude
+    clone._filter_or_exclude_inplace(negate, args, kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1445, in _filter_or_exclude_inplace
+    self._query.add_q(Q(*args, **kwargs))
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\query.py", line 1532, in add_q
+    clause, _ = self._add_q(q_object, self.used_aliases)
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\query.py", line 1562, in _add_q
+    child_clause, needed_inner = self.build_filter(
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\query.py", line 1407, in build_filter
+    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\query.py", line 1217, in solve_lookup_type
+    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\query.py", line 1709, in names_to_path
+    raise FieldError(
+django.core.exceptions.FieldError: Cannot resolve keyword 'is_delete' into field. Choices are: container_code, current_location, details, id, last_operation, operations, status
+[2025-03-30 13:30:42,439][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 117, in view
+    handler = getattr(self, action)
+AttributeError: 'ContainerWCSViewSet' object has no attribute 'update_container_wcs'
+[2025-03-30 13:36:28,971][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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-03-30 13:37:54,701][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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-03-30 13:38:12,020][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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-03-30 13:38:14,703][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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-03-30 13:41:04,879][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 154, in get_container_wcs
+    code:'400',
+NameError: name 'code' is not defined
+[2025-03-30 13:51:34,754][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 119, in get_container_wcs
+    if container_obj.current_location == target_location:
+NameError: name 'target_location' is not defined
+[2025-03-30 13:52:30,409][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 119, in get_container_wcs
+    if container_obj.current_location == target_location:
+NameError: name 'target_location' is not defined
+[2025-03-30 13:53:10,716][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 134, in get_container_wcs
+    data['target_location']=target_location
+NameError: name 'target_location' is not defined
+[2025-03-30 13:53:55,338][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 140, in get_container_wcs
+    data[taskid] = data[tasktype]+'-'+data['month']+'-0001'
+NameError: name 'tasktype' is not defined
+[2025-03-30 13:54:33,878][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 142, in get_container_wcs
+    serializer = self.get_serializer(data=data)
+  File "d:\language\python38\lib\site-packages\rest_framework\generics.py", line 108, in get_serializer
+    serializer_class = self.get_serializer_class()
+  File "d:\language\python38\lib\site-packages\rest_framework\generics.py", line 122, in get_serializer_class
+    assert self.serializer_class is not None, (
+AssertionError: 'ContainerWCSViewSet' should either include a `serializer_class` attribute, or override the `get_serializer_class()` method.
+[2025-03-30 13:57:23,207][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 145, in get_container_wcs
+    ContainerWCSModel.objects.create(**data)
+  File "d:\language\python38\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
+    return getattr(self.get_queryset(), name)(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 669, in create
+    obj = self.model(**kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\base.py", line 565, in __init__
+    raise TypeError(
+TypeError: ContainerWCSModel() got unexpected keyword arguments: 'container_number'
+[2025-03-30 14:04:30,229][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 134, in get_container_wcs
+    data_tosave['month'] = str(timezone.now().strftime('%Y%m'))
+NameError: name 'data_tosave' is not defined
+[2025-03-30 14:05:05,658][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 134, in get_container_wcs
+    data_tosave['month'] = str(timezone.now().strftime('%Y%m'))
+NameError: name 'data_tosave' is not defined
+[2025-03-30 14:05:08,661][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 134, in get_container_wcs
+    data_tosave['month'] = str(timezone.now().strftime('%Y%m'))
+NameError: name 'data_tosave' is not defined
+[2025-03-30 14:05:34,284][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 134, in get_container_wcs
+NameError: name 'data_tosave' is not defined
+[2025-03-30 14:05:46,426][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 138, in get_container_wcs
+    container_obj_month = ContainerWCSModel.objects.filter( month=data['month']).all()
+KeyError: 'month'
+[2025-03-30 14:06:18,082][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 148, in get_container_wcs
+    'messssge':data['message'],
+KeyError: 'message'
+[2025-03-30 14:14:41,513][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 131, in get_container_wcs
+    'data':current_task.to_dict()
+AttributeError: 'ContainerWCSModel' object has no attribute 'to_dict'
+[2025-03-30 14:18:11,018][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 131, in get_container_wcs
+    'data':current_task.to_dict()
+AttributeError: 'ContainerWCSModel' object has no attribute 'to_dict'

+ 691 - 0
logs/server.log

@@ -692,3 +692,694 @@ NameError: name 'goods_code' is not defined
 [2025-03-29 16:54:40,260][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
 [2025-03-29 16:54:44,395][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
 [2025-03-29 16:54:49,884][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-03-30 09:29:06,433][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-03-30 09:30:11,921][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-03-30 09:31:20,073][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-03-30 09:37:54,796][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-03-30 09:40:42,811][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-03-30 09:44:44,209][django.request.log_response():241] [ERROR] Internal Server Error: /container/list/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\mixins.py", line 38, in list
+    queryset = self.filter_queryset(self.get_queryset())
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 58, in get_queryset
+    return ContainerListModel.objects.filter( is_delete=False)
+  File "d:\language\python38\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
+    return getattr(self.get_queryset(), name)(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1420, in filter
+    return self._filter_or_exclude(False, args, kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1438, in _filter_or_exclude
+    clone._filter_or_exclude_inplace(negate, args, kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1445, in _filter_or_exclude_inplace
+    self._query.add_q(Q(*args, **kwargs))
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\query.py", line 1532, in add_q
+    clause, _ = self._add_q(q_object, self.used_aliases)
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\query.py", line 1562, in _add_q
+    child_clause, needed_inner = self.build_filter(
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\query.py", line 1407, in build_filter
+    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\query.py", line 1217, in solve_lookup_type
+    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\query.py", line 1709, in names_to_path
+    raise FieldError(
+django.core.exceptions.FieldError: Cannot resolve keyword 'is_delete' into field. Choices are: container_code, current_location, details, id, last_operation, operations, status
+[2025-03-30 13:30:42,439][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 117, in view
+    handler = getattr(self, action)
+AttributeError: 'ContainerWCSViewSet' object has no attribute 'update_container_wcs'
+[2025-03-30 13:36:28,971][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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-03-30 13:37:54,701][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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-03-30 13:38:12,020][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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-03-30 13:38:14,703][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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-03-30 13:41:04,879][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 154, in get_container_wcs
+    code:'400',
+NameError: name 'code' is not defined
+[2025-03-30 13:51:34,754][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 119, in get_container_wcs
+    if container_obj.current_location == target_location:
+NameError: name 'target_location' is not defined
+[2025-03-30 13:52:30,409][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 119, in get_container_wcs
+    if container_obj.current_location == target_location:
+NameError: name 'target_location' is not defined
+[2025-03-30 13:53:10,716][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 134, in get_container_wcs
+    data['target_location']=target_location
+NameError: name 'target_location' is not defined
+[2025-03-30 13:53:55,338][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 140, in get_container_wcs
+    data[taskid] = data[tasktype]+'-'+data['month']+'-0001'
+NameError: name 'tasktype' is not defined
+[2025-03-30 13:54:33,878][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 142, in get_container_wcs
+    serializer = self.get_serializer(data=data)
+  File "d:\language\python38\lib\site-packages\rest_framework\generics.py", line 108, in get_serializer
+    serializer_class = self.get_serializer_class()
+  File "d:\language\python38\lib\site-packages\rest_framework\generics.py", line 122, in get_serializer_class
+    assert self.serializer_class is not None, (
+AssertionError: 'ContainerWCSViewSet' should either include a `serializer_class` attribute, or override the `get_serializer_class()` method.
+[2025-03-30 13:57:23,207][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 145, in get_container_wcs
+    ContainerWCSModel.objects.create(**data)
+  File "d:\language\python38\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
+    return getattr(self.get_queryset(), name)(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 669, in create
+    obj = self.model(**kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\base.py", line 565, in __init__
+    raise TypeError(
+TypeError: ContainerWCSModel() got unexpected keyword arguments: 'container_number'
+[2025-03-30 14:04:30,229][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 134, in get_container_wcs
+    data_tosave['month'] = str(timezone.now().strftime('%Y%m'))
+NameError: name 'data_tosave' is not defined
+[2025-03-30 14:05:05,658][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 134, in get_container_wcs
+    data_tosave['month'] = str(timezone.now().strftime('%Y%m'))
+NameError: name 'data_tosave' is not defined
+[2025-03-30 14:05:08,661][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 134, in get_container_wcs
+    data_tosave['month'] = str(timezone.now().strftime('%Y%m'))
+NameError: name 'data_tosave' is not defined
+[2025-03-30 14:05:34,284][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 134, in get_container_wcs
+NameError: name 'data_tosave' is not defined
+[2025-03-30 14:05:46,426][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 138, in get_container_wcs
+    container_obj_month = ContainerWCSModel.objects.filter( month=data['month']).all()
+KeyError: 'month'
+[2025-03-30 14:06:18,082][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 148, in get_container_wcs
+    'messssge':data['message'],
+KeyError: 'message'
+[2025-03-30 14:14:41,513][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 131, in get_container_wcs
+    'data':current_task.to_dict()
+AttributeError: 'ContainerWCSModel' object has no attribute 'to_dict'
+[2025-03-30 14:18:11,018][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
+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 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\container\views.py", line 131, in get_container_wcs
+    'data':current_task.to_dict()
+AttributeError: 'ContainerWCSModel' object has no attribute 'to_dict'

+ 1 - 1
templates/src/layouts/MainLayout.vue

@@ -103,7 +103,7 @@
             <q-item-section avatar><q-icon name="speaker_notes" /></q-item-section>
             <q-item-section>{{ $t("menuItem.inbound") }}</q-item-section>
           </q-item>
-          <q-item clickable :to="{ name: 'container' }" @click="linkChange('inbound')" v-ripple exact
+          <q-item clickable :to="{ name: 'container' }" @click="linkChange('container')" v-ripple exact
          >
             <q-item-section avatar><q-icon name="stay_current_landscape" /></q-item-section>
             <q-item-section>托盘管理</q-item-section>

+ 59 - 0
templates/src/pages/container/container.vue

@@ -0,0 +1,59 @@
+<template>
+    <q-page class="flex flex-top">
+      <template>
+        <div class="q-pa-md">
+          <div class="q-gutter-y-md" style="max-width: 100%">
+            <q-tabs v-model="detaillink">
+  
+              <transition appear enter-active-class="animated zoomIn">
+                <q-route-tab
+                  name="containerlist"
+                  :label="'托盘列表'"
+                  icon="img:statics/dashboard/out_statement.png"
+                  :to="{ name: 'containerlist' }"
+                  exact
+                />
+
+              </transition>
+              <transition appear enter-active-class="animated zoomIn">
+                <q-route-tab
+                  name="containeroperate"
+                  :label="'入库出库'"
+                  icon="img:statics/dashboard/out_statement.png"
+                  :to="{ name: 'containeroperate' }"
+                  exact
+                />
+         
+              </transition>
+              <transition appear enter-active-class="animated zoomIn">
+                <q-route-tab
+                  name="containerdetail"
+                  :label="'托盘统计'"
+                  icon="img:statics/dashboard/out_statement.png"
+                  :to="{ name: 'containerdetail' }"
+                  exact
+                />
+              </transition>
+
+  
+              
+            </q-tabs>
+          </div>
+        </div>
+      </template>
+      <div class="main-table2"><router-view /></div>
+    </q-page>
+  </template>
+  
+  <script>
+  export default {
+    name: 'Pagedashboard',
+    data () {
+      return {
+        detaillink: 'inboundAndOutbound'
+      }
+    },
+    methods: {}
+  }
+  </script>
+  

+ 955 - 0
templates/src/pages/container/containerdetail.vue

@@ -0,0 +1,955 @@
+<template>
+    <div style="margin-top: 42px;">
+  
+      <transition appear enter-active-class="animated fadeIn">
+        <q-table class="my-sticky-header-column-table shadow-24" :data="table_list" row-key="id" :separator="separator"
+          :loading="loading" :columns="columns" hide-bottom :pagination.sync="pagination" no-data-label="No data"
+          no-results-label="No data you want" :table-style="{ height: height }" flat bordered>
+          <template v-slot:top>
+            <q-btn-group push>
+              <q-btn :label="$t('new')" icon="add" @click="newForm = true">
+                <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                  content-style="font-size: 12px">{{ $t('newtip') }}</q-tooltip>
+              </q-btn>
+              <q-btn :label="$t('refresh')" icon="refresh" @click="reFresh()">
+                <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                  content-style="font-size: 12px">{{ $t('refreshtip') }}</q-tooltip>
+              </q-btn>
+              <q-btn :label="$t('downloadasnlist')" icon="cloud_download" @click="downloadlistData()">
+              </q-btn>
+            </q-btn-group>
+  
+            <q-space />
+  
+            <div class="flex items-center">
+              <div class="q-mr-md">{{ $t("download_center.createTime") }}</div>
+              <q-input readonly outlined dense v-model="createDate2" :placeholder="interval">
+                <template v-slot:append>
+                  <q-icon name="event" class="cursor-pointer">
+                    <q-popup-proxy ref="qDateProxy" transition-show="scale" transition-hide="scale">
+                      <q-date v-model="createDate1" range>
+                        <div class="row items-center justify-end q-gutter-sm">
+                          <q-btn :label="$t('index.cancel')" color="primary" flat v-close-popup />
+                          <q-btn :label="$t('index.clear')" color="primary" @click="createDate2 = ''; createDate1 = '';"
+                            v-close-popup />
+  
+                        </div>
+                      </q-date>
+                    </q-popup-proxy>
+                  </q-icon>
+                </template>
+              </q-input>
+              <q-btn-group push class="q-ml-md">
+              </q-btn-group>
+              <q-input outlined rounded dense debounce="300" color="primary" v-model="filter" :placeholder="$t('search')"
+                @input="getSearchList()" @keyup.enter="getSearchList()">
+                <template v-slot:append>
+                  <q-icon name="search" @click="getSearchList()" />
+                </template>
+              </q-input>
+            </div>
+          </template>
+          <template v-slot:body="props">
+            <q-tr :props="props">
+  
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="document_date" :props="props">
+                  <q-input dense outlined square v-model="editFormData.document_date"
+                    :label="$t('goods.view_goodslist.document_date')" autofocus
+                    :rules="[val => (val && val.length > 0) || error1]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="document_date" :props="props">{{ props.row.document_date }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="document_number" :props="props">
+                  <q-input dense outlined square v-model="editFormData.document_number"
+                    :label="$t('goods.view_goodslist.document_number')"
+                    :rules="[val => (val && val.length > 0) || error2]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="document_number" :props="props">{{ props.row.document_number }}</q-td>
+              </template>
+  
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="document_type" :props="props">
+                  <q-input dense outlined square v-model="editFormData.document_type"
+                    :label="$t('goods.view_goodslist.document_type')"
+                    :rules="[val => (val && val.length > 0) || error2]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="document_type" :props="props">{{ props.row.document_type }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="business_type" :props="props">
+                  <q-input dense outlined square v-model="editFormData.business_type"
+                    :label="$t('goods.view_goodslist.business_type')"
+                    :rules="[val => (val && val.length > 0) || error4]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="business_type" :props="props">{{ props.row.business_type }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="iout_type" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.iout_type"
+                    :label="$t('goods.view_goodslist.iout_type')" :rules="[val => (val && val > 0) || error5]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="iout_type" :props="props">{{ props.row.iout_type }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="department" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.department"
+                    :label="$t('goods.view_goodslist.department')" :rules="[val => (val && val > 0) || error6]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="department" :props="props">{{ props.row.department }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="warehouse_code" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.warehouse_code"
+                    :label="$t('goods.view_goodslist.warehouse_code')" :rules="[val => (val && val > 0) || error7]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="warehouse_code" :props="props">{{ props.row.warehouse_code }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="warehouse_name" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.warehouse_name"
+                    :label="$t('goods.view_goodslist.warehouse_name')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="warehouse_name" :props="props">{{ props.row.warehouse_name }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_code" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_code"
+                    :label="$t('goods.view_goodslist.goods_code')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_code" :props="props">{{ props.row.goods_code }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_desc" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_desc"
+                    :label="$t('goods.view_goodslist.goods_desc')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_desc" :props="props">{{ props.row.goods_desc }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_std" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_std"
+                    :label="$t('goods.view_goodslist.goods_std')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_std" :props="props">{{ props.row.goods_std }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_batch" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_batch"
+                    :label="$t('goods.view_goodslist.goods_batch')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_batch" :props="props">{{ props.row.goods_batch }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="in_batch" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.in_batch"
+                    :label="$t('goods.view_goodslist.in_batch')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="in_batch" :props="props">{{ props.row.in_batch }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="out_batch" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.out_batch"
+                    :label="$t('goods.view_goodslist.out_batch')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="out_batch" :props="props">{{ props.row.out_batch }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_unit" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_unit"
+                    :label="$t('goods.view_goodslist.goods_unit')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_unit" :props="props">{{ props.row.goods_unit }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_in" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_in" type="number"
+                    :label="$t('goods.view_goodslist.goods_in')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_in" :props="props">{{ props.row.goods_in }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_out" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_out" type="number"
+                    :label="$t('goods.view_goodslist.goods_out')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_out" :props="props">{{ props.row.goods_out }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_notes" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_notes"
+                    :label="$t('goods.view_goodslist.goods_notes')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_notes" :props="props">{{ props.row.goods_notes }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="creator" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.creator"
+                    :label="$t('goods.view_goodslist.creator')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="creator" :props="props">{{ props.row.creator }}</q-td>
+              </template>
+  
+  
+              <template v-if="!editMode">
+                <q-td key="action" :props="props" style="width: 100px">
+                  <q-btn round flat push color="info" icon="print" @click="viewData(props.row)">
+                    <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                      content-style="font-size: 12px">
+                      {{ $t('goods.view_goodslist.print_goods_label') }}
+                    </q-tooltip>
+                  </q-btn>
+                  <q-btn round flat push color="purple" icon="edit" @click="editData(props.row)">
+                    <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                      content-style="font-size: 12px">{{ $t('edit') }}</q-tooltip>
+                  </q-btn>
+                  <q-btn round flat push color="dark" icon="delete" @click="deleteData(props.row.id)">
+                    <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                      content-style="font-size: 12px">{{ $t('delete') }}</q-tooltip>
+                  </q-btn>
+                </q-td>
+              </template>
+              <template v-else-if="editMode">
+                <template v-if="props.row.id === editid">
+                  <q-td key="action" :props="props" style="width: 100px">
+                    <q-btn round flat push color="secondary" icon="check" @click="editDataSubmit()">
+                      <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                        content-style="font-size: 12px">{{ $t('confirmedit') }}</q-tooltip>
+                    </q-btn>
+                    <q-btn round flat push color="red" icon="close" @click="editDataCancel()">
+                      <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                        content-style="font-size: 12px">{{ $t('canceledit') }}</q-tooltip>
+                    </q-btn>
+                  </q-td>
+                </template>
+                <template v-else-if="props.row.id !== editid"></template>
+              </template>
+            </q-tr>
+          </template>
+        </q-table>
+      </transition>
+      <template>
+        <div v-show="max !== 0" class="q-pa-lg flex flex-center">
+          <div>{{ total }} </div>
+          <q-pagination v-model="current" color="black" :max="max" :max-pages="6" boundary-links
+            @click="getSearchList(current); paginationIpt = current" />
+          <div>
+            <input v-model="paginationIpt" @blur="changePageEnter" @keyup.enter="changePageEnter"
+              style="width: 60px; text-align: center" />
+          </div>
+        </div>
+        <div v-show="max === 0" class="q-pa-lg flex flex-center">
+          <q-btn flat push color="dark" :label="$t('no_data')"></q-btn>
+        </div>
+      </template>
+      <q-dialog v-model="newForm">
+        <q-card class="shadow-24">
+          <q-bar class="bg-light-blue-10 text-white rounded-borders" style="height: 50px">
+            <div>{{ $t('newtip') }}</div>
+            <q-space />
+            <q-btn dense flat icon="close" v-close-popup>
+              <q-tooltip content-class="bg-amber text-black shadow-4">{{ $t('index.close') }}</q-tooltip>
+            </q-btn>
+          </q-bar>
+          <q-card-section style="max-height: 325px; width: 400px" class="scroll">
+            <q-input dense outlined square v-model="newFormData.goods_code" :label="$t('goods.view_goodslist.goods_code')"
+              autofocus :rules="[val => (val && val.length > 0) || error1]" @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model="newFormData.goods_desc" :label="$t('goods.view_goodslist.goods_desc')"
+              :rules="[val => (val && val.length > 0) || error2]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_supplier" :options="supplier_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_supplier')"
+              :rules="[val => (val && val.length > 0) || error3]" @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_weight" type="number"
+              :label="$t('goods.view_goodslist.goods_weight')" :rules="[val => (val && val > 0) || error4]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_w" type="number"
+              :label="$t('goods.view_goodslist.goods_w')" :rules="[val => (val && val > 0) || error5]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_d" type="number"
+              :label="$t('goods.view_goodslist.goods_d')" :rules="[val => (val && val > 0) || error6]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_h" type="number"
+              :label="$t('goods.view_goodslist.goods_h')" :rules="[val => (val && val > 0) || error7]"
+              @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_unit" :options="goods_unit_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_unit')"
+              :rules="[val => (val && val.length > 0) || error8]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_class" :options="goods_class_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_class')"
+              :rules="[val => (val && val.length > 0) || error9]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_brand" :options="goods_brand_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_brand')"
+              :rules="[val => (val && val.length > 0) || error10]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_color" :options="goods_color_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_color')"
+              :rules="[val => (val && val.length > 0) || error11]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_shape" :options="goods_shape_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_shape')"
+              :rules="[val => (val && val.length > 0) || error12]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_specs" :options="goods_specs_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_specs')"
+              :rules="[val => (val && val.length > 0) || error13]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_origin" :options="goods_origin_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_origin')"
+              :rules="[val => (val && val.length > 0) || error14]" @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_cost" type="number"
+              :label="$t('goods.view_goodslist.goods_cost')" :rules="[val => (val && val > 0) || error15]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_price" type="number"
+              :label="$t('goods.view_goodslist.goods_price')" :rules="[val => (val && val > 0) || error16]"
+              @keyup.enter="newDataSubmit()" />
+          </q-card-section>
+          <div style="float: right; padding: 15px 15px 15px 0">
+            <q-btn color="white" text-color="black" style="margin-right: 25px" @click="newDataCancel()">{{ $t('cancel')
+            }}</q-btn>
+            <q-btn color="primary" @click="newDataSubmit()">{{ $t('submit') }}</q-btn>
+          </div>
+        </q-card>
+      </q-dialog>
+      <q-dialog v-model="deleteForm">
+        <q-card class="shadow-24">
+          <q-bar class="bg-light-blue-10 text-white rounded-borders" style="height: 50px">
+            <div>{{ $t('delete') }}</div>
+            <q-space />
+            <q-btn dense flat icon="close" v-close-popup>
+              <q-tooltip>{{ $t('index.close') }}</q-tooltip>
+            </q-btn>
+          </q-bar>
+          <q-card-section style="max-height: 325px; width: 400px" class="scroll">{{ $t('deletetip') }}</q-card-section>
+          <div style="float: right; padding: 15px 15px 15px 0">
+            <q-btn color="white" text-color="black" style="margin-right: 25px" @click="deleteDataCancel()">{{ $t('cancel')
+            }}</q-btn>
+            <q-btn color="primary" @click="deleteDataSubmit()">{{ $t('submit') }}</q-btn>
+          </div>
+        </q-card>
+      </q-dialog>
+      <q-dialog v-model="viewForm">
+        <div id="printMe" style="width: 400px;height:280px;background-color: white">
+          <q-card-section>
+            <div class="row" style="height: 50px">
+              <div class="col-3"><img src="statics/goods/logo.png"
+                  style="width: 60px;height: 50px;margin-top: 5px;margin-left: 5px" /></div>
+              <div class="col-9" style="height: 50px;float: contour;margin-top: 10px">
+                <p style="font-size: 20px;font-weight: 550">{{ $t('goods.view_goodslist.goods_code') + ':' + goods_code }}
+                </p>
+              </div>
+            </div>
+            <hr />
+            <div class="row">
+              <div class="col-8" style="margin-top: 30px;padding-left: 3%">
+                <p style="font-size: 20px;font-weight: 550">{{ $t('goods.view_goodslist.goods_name') + ':' }}</p>
+                <p style="font-size: 20px;font-weight: 550">{{ goods_desc }}</p>
+              </div>
+              <div class="col-4" style="margin-top: 25px;"><img :src="bar_code" style="width: 70%;margin-left: 23px" />
+              </div>
+            </div>
+          </q-card-section>
+        </div>
+        <div style="float: right; padding: 15px 15px 15px 0"><q-btn color="primary" icon="print"
+            v-print="printObj">print</q-btn></div>
+      </q-dialog>
+    </div>
+  </template>
+  <router-view />
+  
+  <script>
+  import { getauth, postauth, putauth, deleteauth } from 'boot/axios_request'
+  import { date, exportFile, LocalStorage } from 'quasar'
+  
+  
+  export default {
+    name: 'Pageflowlist',
+    data() {
+      return {
+        createDate1: '',
+        createDate2: '',
+        date_range: '',
+        proxyDate: '',
+        date: '',
+        goods_code: '',
+        goods_desc: '',
+        openid: '',
+        login_name: '',
+        authin: '0',
+        searchUrl: '',
+        pathname: 'reportcenter/flow/',
+        pathfilename: 'reportcenter/file/',
+  
+        pathname_previous: '',
+        pathname_next: '',
+        separator: 'cell',
+        loading: false,
+        height: '',
+        viewForm: false,
+        printObj: {
+          id: 'printMe',
+          popTitle: this.$t('inbound.asn')
+        },
+        table_list: [],
+  
+        columns: [
+          { name: 'document_date', required: true, label: '单据日期', align: 'left', field: 'goods_code' },
+          { name: 'document_number', label: '单据编号', field: 'goods_desc', align: 'center' },
+          { name: 'document_type', label: '单据类型', field: 'goods_supplier', align: 'center' },
+          { name: 'business_type', label: '业务类型', field: 'goods_weight', align: 'center' },
+          { name: 'iout_type', label: '出入库类型', field: 'iout_type', align: 'center' },
+          { name: 'department', label: '部门', field: 'department', align: 'center' },
+          { name: 'warehouse_code', label: '仓库编码', field: 'warehouse_code', align: 'center' },
+          { name: 'warehouse_name', label: '仓库名称', field: 'warehouse_name', align: 'center' },
+          { name: 'goods_code', label: '存货编码', field: 'goods_code', align: 'center' },
+          { name: 'goods_desc', label: '存货', field: 'goods_desc', align: 'center' },
+          { name: 'goods_std', label: '规格型号', field: 'goods_std', align: 'center' },
+          { name: 'goods_batch', label: '批号', field: 'goods_batch', align: 'center' },
+          { name: 'in_batch', label: '入库批号', field: 'in_batch', align: 'center' },
+          { name: 'out_batch', label: '出库批号', field: 'out_batch', align: 'center' },
+          { name: 'goods_unit', label: '计量单位', field: 'goods_unit', align: 'center' },
+          { name: 'goods_in', label: '本期入库', field: 'goods_in', align: 'center' },
+          { name: 'goods_out', label: '本期出库', field: 'goods_out', align: 'center' },
+          { name: 'goods_notes', label: '备注', field: 'goods_notes', align: 'center' },
+          { name: 'creator', label: '创建人', field: 'creator', align: 'center' },
+          { name: 'action', label: '操作', align: 'center' }
+        ],
+        filter: '',
+        pagination: {
+          page: 1,
+          rowsPerPage: 11
+        },
+        newForm: false,
+        newFormData: {
+          document_date: '',
+          document_number: '',
+          document_type: '',
+          business_type: '',
+          iout_type: '',
+          department: '',
+          warehouse_code: '',
+          warehouse_name: '',
+          goods_code: '',
+          goods_desc: '',
+          goods_std: '',
+          goods_batch: '',
+          in_batch: '',
+          out_batch: '',
+          goods_unit: '',
+          goods_in: '',
+          goods_out: '',
+          goods_notes: '',
+          creator: ''
+        },
+        editid: 0,
+        editFormData: {},
+        editMode: false,
+        deleteForm: false,
+        deleteid: 0,
+        bar_code: '',
+        error1: this.$t('goods.view_goodslist.error1'),
+        error2: this.$t('goods.view_goodslist.error2'),
+        error3: this.$t('goods.view_goodslist.error3'),
+        error4: this.$t('goods.view_goodslist.error4'),
+        error5: this.$t('goods.view_goodslist.error5'),
+        error6: this.$t('goods.view_goodslist.error6'),
+        error7: this.$t('goods.view_goodslist.error7'),
+        error8: this.$t('goods.view_unit.error1'),
+        error9: this.$t('goods.view_class.error1'),
+        error10: this.$t('goods.view_brand.error1'),
+        error11: this.$t('goods.view_color.error1'),
+        error12: this.$t('goods.view_shape.error1'),
+        error13: this.$t('goods.view_specs.error1'),
+        error14: this.$t('goods.view_origin.error1'),
+        error15: this.$t('goods.view_goodslist.error8'),
+        error16: this.$t('goods.view_goodslist.error9'),
+        current: 1,
+        max: 0,
+        total: 0,
+        paginationIpt: 1,
+        current: 1,
+  
+      }
+  
+    },
+    computed: {
+      interval() {
+        return this.$t('download_center.start') + ' - ' + this.$t('download_center.end')
+      }
+    },
+    methods: {
+      getList(params = {}) {
+        var _this = this
+        _this.loading = true
+        // 合并基础参数
+        const baseParams = {
+          page: _this.current,
+          page_size: _this.pagination.rowsPerPage
+        }
+  
+        // 创建URLSearchParams处理参数
+        const queryParams = new URLSearchParams({
+          ...baseParams,
+          ...params
+        })
+        console.log(queryParams)
+        // 过滤空值参数
+        Array.from(queryParams.entries()).forEach(([key, value]) => {
+          if (value === '' || value === null || value === undefined) {
+            queryParams.delete(key)
+          }
+        })
+  
+        getauth(`${_this.pathname}?${queryParams}`)
+          .then(res => {
+            _this.table_list = res.results
+            _this.total = res.count
+            _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage) || 0
+            _this.pathname_previous = res.previous
+            _this.pathname_next = res.next
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+          .finally(() => {
+            _this.loading = false
+          })
+      },
+      changePageEnter() {
+        if (Number(this.paginationIpt) < 1) {
+          this.current = 1
+          this.paginationIpt = 1
+        } else if (Number(this.paginationIpt) > this.max) {
+          this.current = this.max
+          this.paginationIpt = this.max
+        } else {
+          this.current = Number(this.paginationIpt)
+        }
+        this.getSearchList(this.current)
+      },
+  
+      // 带搜索条件加载
+      getSearchList(page = 1) {
+        this.current = page
+        this.paginationIpt = page
+        this.getList({
+          goods_desc__icontains: this.filter,
+          document_date__range: this.date_range
+        })
+      },
+      downloadlistData() {
+        this.getfileList()
+  
+      },
+      getfileList() {
+        var _this = this
+        _this.loading = true
+        const params = {
+          goods_desc__icontains: _this.filter,
+          document_date__range: _this.date_range
+        }
+        const queryParams = new URLSearchParams({
+          ...params
+        })
+        console.log(queryParams)
+        // 过滤空值参数
+        Array.from(queryParams.entries()).forEach(([key, value]) => {
+          if (value === '' || value === null || value === undefined) {
+            queryParams.delete(key)
+          }
+        })
+        console.log(`${_this.pathfilename}?${queryParams}`)
+        getauth(`${_this.pathfilename}?${queryParams}`)
+          .then(res => {
+            var timeStamp = Date.now()
+            var formattedString = date.formatDate(timeStamp, 'YYYYMMDDHHmmss')
+            const status = exportFile(_this.pathfilename + 'list' + formattedString + '.csv', '\uFEFF' + res, 'text/csv')
+            if (status !== true) {
+              _this.$q.notify({
+                message: 'Browser denied file download...',
+                color: 'negative',
+                icon: 'warning'
+              })
+            }
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+          .finally(() => {
+            _this.loading = false
+          })
+      },
+  
+      getListPrevious() {
+        var _this = this
+        if (LocalStorage.has('auth')) {
+          getauth(_this.pathname_previous, {})
+            .then(res => {
+              _this.table_list = res.results
+              _this.pathname_previous = res.previous
+              _this.pathname_next = res.next
+            })
+            .catch(err => {
+              _this.$q.notify({
+                message: err.detail,
+                icon: 'close',
+                color: 'negative'
+              })
+            })
+        } else {
+        }
+      },
+      getListNext() {
+        var _this = this
+        if (LocalStorage.has('auth')) {
+          getauth(_this.pathname_next, {})
+            .then(res => {
+              _this.table_list = res.results
+  
+              _this.pathname_previous = res.previous
+              _this.pathname_next = res.next
+            })
+            .catch(err => {
+              _this.$q.notify({
+                message: err.detail,
+                icon: 'close',
+                color: 'negative'
+              })
+            })
+        }
+      },
+      reFresh() {
+        var _this = this
+        _this.getSearchList()
+      },
+  
+      newDataSubmit() {
+        var _this = this
+        var goodscodes = []
+        _this.table_list.forEach(i => {
+          goodscodes.push(i.goods_code)
+        })
+        if (goodscodes.indexOf(_this.newFormData.goods_code) === -1 && _this.newFormData.goods_code.length !== 0) {
+          _this.newFormData.creater = _this.login_name
+          postauth(_this.pathname, _this.newFormData)
+            .then(res => {
+              _this.getSearchList()
+              _this.newDataCancel()
+              if (res.status_code != 500) {
+                _this.$q.notify({
+                  message: 'Success Create',
+                  icon: 'check',
+                  color: 'green'
+                })
+              }
+            })
+            .catch(err => {
+              _this.$q.notify({
+                message: err.detail,
+                icon: 'close',
+                color: 'negative'
+              })
+            })
+        } else if (goodscodes.indexOf(_this.newFormData.goods_code) !== -1) {
+          _this.$q.notify({
+            message: _this.$t('notice.goodserror.goods_listerror'),
+            icon: 'close',
+            color: 'negative'
+          })
+        } else if (_this.newFormData.goods_code.length === 0) {
+          _this.$q.notify({
+            message: _this.$t('goods.view_goodslist.error1'),
+            icon: 'close',
+            color: 'negative'
+          })
+        }
+        goodscodes = []
+      },
+      newDataCancel() {
+        var _this = this
+        _this.newForm = false
+        _this.newFormData = {
+          goods_code: '',
+          goods_desc: '',
+          goods_supplier: '',
+          goods_weight: '',
+          goods_w: '',
+          goods_d: '',
+          goods_h: '',
+          goods_unit: '',
+          goods_class: '',
+          goods_brand: '',
+          goods_color: '',
+          goods_shape: '',
+          goods_specs: '',
+          goods_origin: '',
+          goods_cost: '',
+          goods_price: '',
+          creater: ''
+        }
+      },
+      editData(e) {
+        var _this = this
+        _this.editMode = true
+        _this.editid = e.id
+        _this.editFormData = {
+          goods_code: e.goods_code,
+          goods_desc: e.goods_desc,
+          goods_supplier: e.goods_supplier,
+          goods_weight: e.goods_weight,
+          goods_w: e.goods_w,
+          goods_d: e.goods_d,
+          goods_h: e.goods_h,
+          goods_unit: e.goods_unit,
+          goods_class: e.goods_class,
+          goods_brand: e.goods_brand,
+          goods_color: e.goods_color,
+          goods_shape: e.goods_shape,
+          goods_specs: e.goods_specs,
+          goods_origin: e.goods_origin,
+          goods_cost: e.goods_cost,
+          goods_price: e.goods_price,
+          creater: _this.login_name,
+          bar_code: e.bar_code
+        }
+      },
+      editDataSubmit() {
+        var _this = this
+        putauth(_this.pathname + _this.editid + '/', _this.editFormData)
+          .then(res => {
+            _this.editDataCancel()
+            _this.getSearchList()
+            if (res.status_code != 500) {
+              _this.$q.notify({
+                message: 'Success Edit Data',
+                icon: 'check',
+                color: 'green'
+              })
+            }
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+      },
+      editDataCancel() {
+        var _this = this
+        _this.editMode = false
+        _this.editid = 0
+        _this.editFormData = {
+          goods_code: '',
+          goods_desc: '',
+          goods_supplier: '',
+          goods_weight: '',
+          goods_w: '',
+          goods_d: '',
+          goods_h: '',
+          goods_unit: '',
+          goods_class: '',
+          goods_brand: '',
+          goods_color: '',
+          goods_shape: '',
+          goods_specs: '',
+          goods_origin: '',
+          goods_cost: '',
+          goods_price: '',
+          creater: ''
+        }
+      },
+      deleteData(e) {
+        var _this = this
+        _this.deleteForm = true
+        _this.deleteid = e
+      },
+      deleteDataSubmit() {
+        var _this = this
+        deleteauth(_this.pathname + _this.deleteid + '/')
+          .then(res => {
+            _this.deleteDataCancel()
+            _this.getSearchList()
+            _this.$q.notify({
+              message: 'Success Edit Data',
+              icon: 'check',
+              color: 'green'
+            })
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+      },
+      deleteDataCancel() {
+        var _this = this
+        _this.deleteForm = false
+        _this.deleteid = 0
+      },
+      viewData(e) {
+        var _this = this
+        var QRCode = require('qrcode')
+        QRCode.toDataURL(e.bar_code, [
+          {
+            errorCorrectionLevel: 'H',
+            mode: 'byte',
+            version: '2',
+            type: 'image/jpeg'
+          }
+        ])
+          .then(url => {
+            _this.goods_code = e.goods_code
+            _this.goods_desc = e.goods_desc
+            _this.bar_code = url
+          })
+          .catch(err => {
+            console.error(err)
+          })
+        _this.viewForm = true
+      },
+  
+      updateProxy() {
+        var _this = this
+        _this.proxyDate = _this.date
+      }
+  
+    },
+    created() {
+      var _this = this
+      if (LocalStorage.has('openid')) {
+        _this.openid = LocalStorage.getItem('openid')
+      } else {
+        _this.openid = ''
+        LocalStorage.set('openid', '')
+      }
+      if (LocalStorage.has('login_name')) {
+        _this.login_name = LocalStorage.getItem('login_name')
+      } else {
+        _this.login_name = ''
+        LocalStorage.set('login_name', '')
+      }
+      if (LocalStorage.has('auth')) {
+        const timeStamp = Date.now()
+        const formattedString = date.formatDate(timeStamp, 'YYYY/MM/DD')
+        _this.date = formattedString
+        console.log(_this.date)
+        _this.authin = '1'
+        _this.getList()
+      } else {
+        _this.authin = '0'
+      }
+    },
+    mounted() {
+      var _this = this
+      if (_this.$q.platform.is.electron) {
+        _this.height = String(_this.$q.screen.height - 290) + 'px'
+      } else {
+        _this.height = _this.$q.screen.height - 290 + '' + 'px'
+      }
+    },
+    updated() { },
+    destroyed() { },
+    // 在 watch 或方法中添加调试代码
+    watch: {
+      createDate1(val) {
+        if (val) {
+          if (val.to) {
+            this.createDate2 = `${val.from} - ${val.to}`
+            this.date_range = `${val.from},${val.to} `
+  
+            // this.downloadhUrl = this.pathname + 'filelist/?' + 'document_date__range=' + this.date_range
+          } else {
+            this.createDate2 = `${val}`
+            this.dateArray = val.split('/')
+            this.searchUrl = this.pathname + '?' + 'document_date__year=' + this.dateArray[0] + '&' + 'document_date__month=' + this.dateArray[1] + '&' + 'document_date__day=' + this.dateArray[2]
+            // this.downloadhUrl = this.pathname + 'filelist/?' + 'document_date__year=' + this.dateArray[0] + '&' + 'document_date__month=' + this.dateArray[1] + '&' + 'document_date__day=' + this.dateArray[2]
+          }
+          this.date_range = this.date_range.replace(/\//g, '-')
+  
+          this.getSearchList()
+          this.$refs.qDateProxy.hide()
+        }
+        else {
+          this.createDate2 = ''
+          this.date_range = ''
+          this.getSearchList()
+        }
+      }
+    }
+  }
+  </script>
+  <style scoped>
+  /* 添加在 <style> 中 */
+  .q-date__calendar-item--selected {
+    transition: all 0.3s ease;
+    background-color: #1976d2 !important;
+  }
+  
+  .q-date__range {
+    background-color: rgba(25, 118, 210, 0.1);
+  }
+  </style>

+ 957 - 0
templates/src/pages/container/containerlist.vue

@@ -0,0 +1,957 @@
+<template>
+    <div style="margin-top: 42px;">
+  
+      <transition appear enter-active-class="animated fadeIn">
+        <q-table class="my-sticky-header-column-table shadow-24" :data="table_list" row-key="id" :separator="separator"
+          :loading="loading" :columns="columns" hide-bottom :pagination.sync="pagination" no-data-label="No data"
+          no-results-label="No data you want" :table-style="{ height: height }" flat bordered>
+          <template v-slot:top>
+            <q-btn-group push>
+              <q-btn :label="$t('new')" icon="add" @click="newForm = true">
+                <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                  content-style="font-size: 12px">{{ $t('newtip') }}</q-tooltip>
+              </q-btn>
+              <q-btn :label="$t('refresh')" icon="refresh" @click="reFresh()">
+                <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                  content-style="font-size: 12px">{{ $t('refreshtip') }}</q-tooltip>
+              </q-btn>
+              <q-btn :label="$t('downloadasnlist')" icon="cloud_download" @click="downloadlistData()">
+              </q-btn>
+            </q-btn-group>
+  
+            <q-space />
+  
+            <div class="flex items-center">
+              <div class="q-mr-md">{{ $t("download_center.createTime") }}</div>
+              <q-input readonly outlined dense v-model="createDate2" :placeholder="interval">
+                <template v-slot:append>
+                  <q-icon name="event" class="cursor-pointer">
+                    <q-popup-proxy ref="qDateProxy" transition-show="scale" transition-hide="scale">
+                      <q-date v-model="createDate1" range>
+                        <div class="row items-center justify-end q-gutter-sm">
+                          <q-btn :label="$t('index.cancel')" color="primary" flat v-close-popup />
+                          <q-btn :label="$t('index.clear')" color="primary" @click="createDate2 = ''; createDate1 = '';"
+                            v-close-popup />
+  
+                        </div>
+                      </q-date>
+                    </q-popup-proxy>
+                  </q-icon>
+                </template>
+              </q-input>
+              <q-btn-group push class="q-ml-md">
+              </q-btn-group>
+              <q-input outlined rounded dense debounce="300" color="primary" v-model="filter" :placeholder="$t('search')"
+                @input="getSearchList()" @keyup.enter="getSearchList()">
+                <template v-slot:append>
+                  <q-icon name="search" @click="getSearchList()" />
+                </template>
+              </q-input>
+            </div>
+          </template>
+          <template v-slot:body="props">
+            <q-tr :props="props">
+              
+                <template v-if="props.row.id === editid">
+              <q-td key="detail" :props="props">
+                <q-btn round flat push color="black" icon="description" @click="detailData(props.row)">
+                  <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                    content-style="font-size: 12px">{{ "查看批次详情"}}</q-tooltip>
+                </q-btn>
+                </q-td>
+            </template>
+            <template v-else-if="props.row.id !== editid">
+              <q-td key="detail" :props="props">
+                <q-btn round flat push color="black" icon="description" @click="detailData(props.row)">
+                  <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                    content-style="font-size: 12px">{{ "查看批次详情" }}</q-tooltip>
+                </q-btn>
+              </q-td>
+            </template>
+
+            <template v-if="props.row.id === editid">
+                <q-td key="container_code" :props="props">
+                  <q-input dense outlined square v-model="editFormData.container_code"
+                    :label="'托盘编码'" autofocus
+                    :rules="[val => (val && val.length > 0) || error1]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="container_code" :props="props">{{ props.row.container_code }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="container_location" :props="props">
+                  <q-input dense outlined square v-model="editFormData.container_location"
+                    :label="'当前位置'"
+                    :rules="[val => (val && val.length > 0) || error2]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="container_location" :props="props">{{ props.row.container_location }}</q-td>
+              </template>
+  
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="status" :props="props">
+                  <q-input dense outlined square v-model="editFormData.status"
+                    :label="'状态'"
+                    :rules="[val => (val && val.length > 0) || error2]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="status" :props="props">{{ props.row.status }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="business_type" :props="props">
+                  <q-input dense outlined square v-model="editFormData.business_type"
+                    :label="$t('goods.view_goodslist.business_type')"
+                    :rules="[val => (val && val.length > 0) || error4]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="business_type" :props="props">{{ props.row.business_type }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="iout_type" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.iout_type"
+                    :label="$t('goods.view_goodslist.iout_type')" :rules="[val => (val && val > 0) || error5]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="iout_type" :props="props">{{ props.row.iout_type }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="department" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.department"
+                    :label="$t('goods.view_goodslist.department')" :rules="[val => (val && val > 0) || error6]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="department" :props="props">{{ props.row.department }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="warehouse_code" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.warehouse_code"
+                    :label="$t('goods.view_goodslist.warehouse_code')" :rules="[val => (val && val > 0) || error7]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="warehouse_code" :props="props">{{ props.row.warehouse_code }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="warehouse_name" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.warehouse_name"
+                    :label="$t('goods.view_goodslist.warehouse_name')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="warehouse_name" :props="props">{{ props.row.warehouse_name }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_code" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_code"
+                    :label="$t('goods.view_goodslist.goods_code')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_code" :props="props">{{ props.row.goods_code }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_desc" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_desc"
+                    :label="$t('goods.view_goodslist.goods_desc')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_desc" :props="props">{{ props.row.goods_desc }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_std" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_std"
+                    :label="$t('goods.view_goodslist.goods_std')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_std" :props="props">{{ props.row.goods_std }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_batch" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_batch"
+                    :label="$t('goods.view_goodslist.goods_batch')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_batch" :props="props">{{ props.row.goods_batch }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="in_batch" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.in_batch"
+                    :label="$t('goods.view_goodslist.in_batch')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="in_batch" :props="props">{{ props.row.in_batch }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="out_batch" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.out_batch"
+                    :label="$t('goods.view_goodslist.out_batch')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="out_batch" :props="props">{{ props.row.out_batch }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_unit" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_unit"
+                    :label="$t('goods.view_goodslist.goods_unit')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_unit" :props="props">{{ props.row.goods_unit }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_in" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_in" type="number"
+                    :label="$t('goods.view_goodslist.goods_in')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_in" :props="props">{{ props.row.goods_in }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_out" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_out" type="number"
+                    :label="$t('goods.view_goodslist.goods_out')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_out" :props="props">{{ props.row.goods_out }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_notes" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_notes"
+                    :label="$t('goods.view_goodslist.goods_notes')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_notes" :props="props">{{ props.row.goods_notes }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="creator" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.creator"
+                    :label="$t('goods.view_goodslist.creator')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="creator" :props="props">{{ props.row.creator }}</q-td>
+              </template>
+  
+  
+              <template v-if="!editMode">
+                <q-td key="action" :props="props" style="width: 100px">
+                  <q-btn round flat push color="info" icon="print" @click="viewData(props.row)">
+                    <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                      content-style="font-size: 12px">
+                      {{ $t('goods.view_goodslist.print_goods_label') }}
+                    </q-tooltip>
+                  </q-btn>
+                  <q-btn round flat push color="purple" icon="edit" @click="editData(props.row)">
+                    <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                      content-style="font-size: 12px">{{ $t('edit') }}</q-tooltip>
+                  </q-btn>
+                  <q-btn round flat push color="dark" icon="delete" @click="deleteData(props.row.id)">
+                    <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                      content-style="font-size: 12px">{{ $t('delete') }}</q-tooltip>
+                  </q-btn>
+                </q-td>
+              </template>
+              <template v-else-if="editMode">
+                <template v-if="props.row.id === editid">
+                  <q-td key="action" :props="props" style="width: 100px">
+                    <q-btn round flat push color="secondary" icon="check" @click="editDataSubmit()">
+                      <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                        content-style="font-size: 12px">{{ $t('confirmedit') }}</q-tooltip>
+                    </q-btn>
+                    <q-btn round flat push color="red" icon="close" @click="editDataCancel()">
+                      <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                        content-style="font-size: 12px">{{ $t('canceledit') }}</q-tooltip>
+                    </q-btn>
+                  </q-td>
+                </template>
+                <template v-else-if="props.row.id !== editid"></template>
+              </template>
+            </q-tr>
+          </template>
+        </q-table>
+      </transition>
+      <template>
+        <div v-show="max !== 0" class="q-pa-lg flex flex-center">
+          <div>{{ total }} </div>
+          <q-pagination v-model="current" color="black" :max="max" :max-pages="6" boundary-links
+            @click="getSearchList(current); paginationIpt = current" />
+          <div>
+            <input v-model="paginationIpt" @blur="changePageEnter" @keyup.enter="changePageEnter"
+              style="width: 60px; text-align: center" />
+          </div>
+        </div>
+        <div v-show="max === 0" class="q-pa-lg flex flex-center">
+          <q-btn flat push color="dark" :label="$t('no_data')"></q-btn>
+        </div>
+      </template>
+      <q-dialog v-model="newForm">
+        <q-card class="shadow-24">
+          <q-bar class="bg-light-blue-10 text-white rounded-borders" style="height: 50px">
+            <div>{{ $t('newtip') }}</div>
+            <q-space />
+            <q-btn dense flat icon="close" v-close-popup>
+              <q-tooltip content-class="bg-amber text-black shadow-4">{{ $t('index.close') }}</q-tooltip>
+            </q-btn>
+          </q-bar>
+          <q-card-section style="max-height: 325px; width: 400px" class="scroll">
+            <q-input dense outlined square v-model="newFormData.goods_code" :label="$t('goods.view_goodslist.goods_code')"
+              autofocus :rules="[val => (val && val.length > 0) || error1]" @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model="newFormData.goods_desc" :label="$t('goods.view_goodslist.goods_desc')"
+              :rules="[val => (val && val.length > 0) || error2]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_supplier" :options="supplier_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_supplier')"
+              :rules="[val => (val && val.length > 0) || error3]" @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_weight" type="number"
+              :label="$t('goods.view_goodslist.goods_weight')" :rules="[val => (val && val > 0) || error4]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_w" type="number"
+              :label="$t('goods.view_goodslist.goods_w')" :rules="[val => (val && val > 0) || error5]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_d" type="number"
+              :label="$t('goods.view_goodslist.goods_d')" :rules="[val => (val && val > 0) || error6]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_h" type="number"
+              :label="$t('goods.view_goodslist.goods_h')" :rules="[val => (val && val > 0) || error7]"
+              @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_unit" :options="goods_unit_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_unit')"
+              :rules="[val => (val && val.length > 0) || error8]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_class" :options="goods_class_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_class')"
+              :rules="[val => (val && val.length > 0) || error9]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_brand" :options="goods_brand_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_brand')"
+              :rules="[val => (val && val.length > 0) || error10]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_color" :options="goods_color_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_color')"
+              :rules="[val => (val && val.length > 0) || error11]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_shape" :options="goods_shape_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_shape')"
+              :rules="[val => (val && val.length > 0) || error12]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_specs" :options="goods_specs_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_specs')"
+              :rules="[val => (val && val.length > 0) || error13]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_origin" :options="goods_origin_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_origin')"
+              :rules="[val => (val && val.length > 0) || error14]" @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_cost" type="number"
+              :label="$t('goods.view_goodslist.goods_cost')" :rules="[val => (val && val > 0) || error15]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_price" type="number"
+              :label="$t('goods.view_goodslist.goods_price')" :rules="[val => (val && val > 0) || error16]"
+              @keyup.enter="newDataSubmit()" />
+          </q-card-section>
+          <div style="float: right; padding: 15px 15px 15px 0">
+            <q-btn color="white" text-color="black" style="margin-right: 25px" @click="newDataCancel()">{{ $t('cancel')
+            }}</q-btn>
+            <q-btn color="primary" @click="newDataSubmit()">{{ $t('submit') }}</q-btn>
+          </div>
+        </q-card>
+      </q-dialog>
+      <q-dialog v-model="deleteForm">
+        <q-card class="shadow-24">
+          <q-bar class="bg-light-blue-10 text-white rounded-borders" style="height: 50px">
+            <div>{{ $t('delete') }}</div>
+            <q-space />
+            <q-btn dense flat icon="close" v-close-popup>
+              <q-tooltip>{{ $t('index.close') }}</q-tooltip>
+            </q-btn>
+          </q-bar>
+          <q-card-section style="max-height: 325px; width: 400px" class="scroll">{{ $t('deletetip') }}</q-card-section>
+          <div style="float: right; padding: 15px 15px 15px 0">
+            <q-btn color="white" text-color="black" style="margin-right: 25px" @click="deleteDataCancel()">{{ $t('cancel')
+            }}</q-btn>
+            <q-btn color="primary" @click="deleteDataSubmit()">{{ $t('submit') }}</q-btn>
+          </div>
+        </q-card>
+      </q-dialog>
+      <q-dialog v-model="viewForm">
+        <div id="printMe" style="width: 400px;height:280px;background-color: white">
+          <q-card-section>
+            <div class="row" style="height: 50px">
+              <div class="col-3"><img src="statics/goods/logo.png"
+                  style="width: 60px;height: 50px;margin-top: 5px;margin-left: 5px" /></div>
+              <div class="col-9" style="height: 50px;float: contour;margin-top: 10px">
+                <p style="font-size: 20px;font-weight: 550">{{ $t('goods.view_goodslist.goods_code') + ':' + goods_code }}
+                </p>
+              </div>
+            </div>
+            <hr />
+            <div class="row">
+              <div class="col-8" style="margin-top: 30px;padding-left: 3%">
+                <p style="font-size: 20px;font-weight: 550">{{ $t('goods.view_goodslist.goods_name') + ':' }}</p>
+                <p style="font-size: 20px;font-weight: 550">{{ goods_desc }}</p>
+              </div>
+              <div class="col-4" style="margin-top: 25px;"><img :src="bar_code" style="width: 70%;margin-left: 23px" />
+              </div>
+            </div>
+          </q-card-section>
+        </div>
+        <div style="float: right; padding: 15px 15px 15px 0"><q-btn color="primary" icon="print"
+            v-print="printObj">print</q-btn></div>
+      </q-dialog>
+    </div>
+  </template>
+  <router-view />
+  
+  <script>
+  import { getauth, postauth, putauth, deleteauth } from 'boot/axios_request'
+  import { date, exportFile, LocalStorage } from 'quasar'
+  
+  
+  export default {
+    name: 'Pageflowlist',
+    data() {
+      return {
+        createDate1: '',
+        createDate2: '',
+        date_range: '',
+        proxyDate: '',
+        date: '',
+        goods_code: '',
+        goods_desc: '',
+        openid: '',
+        login_name: '',
+        authin: '0',
+        searchUrl: '',
+        pathname: 'reportcenter/flow/',
+        pathfilename: 'reportcenter/file/',
+  
+        pathname_previous: '',
+        pathname_next: '',
+        separator: 'cell',
+        loading: false,
+        height: '',
+        viewForm: false,
+        printObj: {
+          id: 'printMe',
+          popTitle: this.$t('inbound.asn')
+        },
+        table_list: [],
+  
+        columns: [
+            { name :'detail',label:'详情', field: 'detail', align: 'center'},
+            { name: 'container_code', required: true, label: '托盘编码', align: 'center', field: 'container_code' },
+            { name: 'current_location', label: '当前位置', field: 'current_location', align: 'center' },
+            { name: 'status', label: '托盘状态', field: 'status', align: 'center' },
+            { name: 'last_operation', label: '上次操作时间', field: 'last_operation', align: 'center' },
+            
+        ],
+        filter: '',
+        pagination: {
+          page: 1,
+          rowsPerPage: 11
+        },
+        newForm: false,
+        newFormData: {
+          document_date: '',
+          document_number: '',
+          document_type: '',
+          business_type: '',
+          iout_type: '',
+          department: '',
+          warehouse_code: '',
+          warehouse_name: '',
+          goods_code: '',
+          goods_desc: '',
+          goods_std: '',
+          goods_batch: '',
+          in_batch: '',
+          out_batch: '',
+          goods_unit: '',
+          goods_in: '',
+          goods_out: '',
+          goods_notes: '',
+          creator: ''
+        },
+        editid: 0,
+        editFormData: {},
+        editMode: false,
+        deleteForm: false,
+        deleteid: 0,
+        bar_code: '',
+        error1: this.$t('goods.view_goodslist.error1'),
+        error2: this.$t('goods.view_goodslist.error2'),
+        error3: this.$t('goods.view_goodslist.error3'),
+        error4: this.$t('goods.view_goodslist.error4'),
+        error5: this.$t('goods.view_goodslist.error5'),
+        error6: this.$t('goods.view_goodslist.error6'),
+        error7: this.$t('goods.view_goodslist.error7'),
+        error8: this.$t('goods.view_unit.error1'),
+        error9: this.$t('goods.view_class.error1'),
+        error10: this.$t('goods.view_brand.error1'),
+        error11: this.$t('goods.view_color.error1'),
+        error12: this.$t('goods.view_shape.error1'),
+        error13: this.$t('goods.view_specs.error1'),
+        error14: this.$t('goods.view_origin.error1'),
+        error15: this.$t('goods.view_goodslist.error8'),
+        error16: this.$t('goods.view_goodslist.error9'),
+        current: 1,
+        max: 0,
+        total: 0,
+        paginationIpt: 1,
+        current: 1,
+  
+      }
+  
+    },
+    computed: {
+      interval() {
+        return this.$t('download_center.start') + ' - ' + this.$t('download_center.end')
+      }
+    },
+    methods: {
+      getList(params = {}) {
+        var _this = this
+        _this.loading = true
+        // 合并基础参数
+        const baseParams = {
+          page: _this.current,
+          page_size: _this.pagination.rowsPerPage
+        }
+  
+        // 创建URLSearchParams处理参数
+        const queryParams = new URLSearchParams({
+          ...baseParams,
+          ...params
+        })
+        console.log(queryParams)
+        // 过滤空值参数
+        Array.from(queryParams.entries()).forEach(([key, value]) => {
+          if (value === '' || value === null || value === undefined) {
+            queryParams.delete(key)
+          }
+        })
+  
+        getauth(`${_this.pathname}?${queryParams}`)
+          .then(res => {
+            _this.table_list = res.results
+            _this.total = res.count
+            _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage) || 0
+            _this.pathname_previous = res.previous
+            _this.pathname_next = res.next
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+          .finally(() => {
+            _this.loading = false
+          })
+      },
+      changePageEnter() {
+        if (Number(this.paginationIpt) < 1) {
+          this.current = 1
+          this.paginationIpt = 1
+        } else if (Number(this.paginationIpt) > this.max) {
+          this.current = this.max
+          this.paginationIpt = this.max
+        } else {
+          this.current = Number(this.paginationIpt)
+        }
+        this.getSearchList(this.current)
+      },
+  
+      // 带搜索条件加载
+      getSearchList(page = 1) {
+        this.current = page
+        this.paginationIpt = page
+        this.getList({
+          goods_desc__icontains: this.filter,
+          document_date__range: this.date_range
+        })
+      },
+      downloadlistData() {
+        this.getfileList()
+  
+      },
+      getfileList() {
+        var _this = this
+        _this.loading = true
+        const params = {
+          goods_desc__icontains: _this.filter,
+          document_date__range: _this.date_range
+        }
+        const queryParams = new URLSearchParams({
+          ...params
+        })
+        console.log(queryParams)
+        // 过滤空值参数
+        Array.from(queryParams.entries()).forEach(([key, value]) => {
+          if (value === '' || value === null || value === undefined) {
+            queryParams.delete(key)
+          }
+        })
+        console.log(`${_this.pathfilename}?${queryParams}`)
+        getauth(`${_this.pathfilename}?${queryParams}`)
+          .then(res => {
+            var timeStamp = Date.now()
+            var formattedString = date.formatDate(timeStamp, 'YYYYMMDDHHmmss')
+            const status = exportFile(_this.pathfilename + 'list' + formattedString + '.csv', '\uFEFF' + res, 'text/csv')
+            if (status !== true) {
+              _this.$q.notify({
+                message: 'Browser denied file download...',
+                color: 'negative',
+                icon: 'warning'
+              })
+            }
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+          .finally(() => {
+            _this.loading = false
+          })
+      },
+  
+      getListPrevious() {
+        var _this = this
+        if (LocalStorage.has('auth')) {
+          getauth(_this.pathname_previous, {})
+            .then(res => {
+              _this.table_list = res.results
+              _this.pathname_previous = res.previous
+              _this.pathname_next = res.next
+            })
+            .catch(err => {
+              _this.$q.notify({
+                message: err.detail,
+                icon: 'close',
+                color: 'negative'
+              })
+            })
+        } else {
+        }
+      },
+      getListNext() {
+        var _this = this
+        if (LocalStorage.has('auth')) {
+          getauth(_this.pathname_next, {})
+            .then(res => {
+              _this.table_list = res.results
+  
+              _this.pathname_previous = res.previous
+              _this.pathname_next = res.next
+            })
+            .catch(err => {
+              _this.$q.notify({
+                message: err.detail,
+                icon: 'close',
+                color: 'negative'
+              })
+            })
+        }
+      },
+      reFresh() {
+        var _this = this
+        _this.getSearchList()
+      },
+  
+      newDataSubmit() {
+        var _this = this
+        var goodscodes = []
+        _this.table_list.forEach(i => {
+          goodscodes.push(i.goods_code)
+        })
+        if (goodscodes.indexOf(_this.newFormData.goods_code) === -1 && _this.newFormData.goods_code.length !== 0) {
+          _this.newFormData.creater = _this.login_name
+          postauth(_this.pathname, _this.newFormData)
+            .then(res => {
+              _this.getSearchList()
+              _this.newDataCancel()
+              if (res.status_code != 500) {
+                _this.$q.notify({
+                  message: 'Success Create',
+                  icon: 'check',
+                  color: 'green'
+                })
+              }
+            })
+            .catch(err => {
+              _this.$q.notify({
+                message: err.detail,
+                icon: 'close',
+                color: 'negative'
+              })
+            })
+        } else if (goodscodes.indexOf(_this.newFormData.goods_code) !== -1) {
+          _this.$q.notify({
+            message: _this.$t('notice.goodserror.goods_listerror'),
+            icon: 'close',
+            color: 'negative'
+          })
+        } else if (_this.newFormData.goods_code.length === 0) {
+          _this.$q.notify({
+            message: _this.$t('goods.view_goodslist.error1'),
+            icon: 'close',
+            color: 'negative'
+          })
+        }
+        goodscodes = []
+      },
+      newDataCancel() {
+        var _this = this
+        _this.newForm = false
+        _this.newFormData = {
+          goods_code: '',
+          goods_desc: '',
+          goods_supplier: '',
+          goods_weight: '',
+          goods_w: '',
+          goods_d: '',
+          goods_h: '',
+          goods_unit: '',
+          goods_class: '',
+          goods_brand: '',
+          goods_color: '',
+          goods_shape: '',
+          goods_specs: '',
+          goods_origin: '',
+          goods_cost: '',
+          goods_price: '',
+          creater: ''
+        }
+      },
+      editData(e) {
+        var _this = this
+        _this.editMode = true
+        _this.editid = e.id
+        _this.editFormData = {
+          goods_code: e.goods_code,
+          goods_desc: e.goods_desc,
+          goods_supplier: e.goods_supplier,
+          goods_weight: e.goods_weight,
+          goods_w: e.goods_w,
+          goods_d: e.goods_d,
+          goods_h: e.goods_h,
+          goods_unit: e.goods_unit,
+          goods_class: e.goods_class,
+          goods_brand: e.goods_brand,
+          goods_color: e.goods_color,
+          goods_shape: e.goods_shape,
+          goods_specs: e.goods_specs,
+          goods_origin: e.goods_origin,
+          goods_cost: e.goods_cost,
+          goods_price: e.goods_price,
+          creater: _this.login_name,
+          bar_code: e.bar_code
+        }
+      },
+      editDataSubmit() {
+        var _this = this
+        putauth(_this.pathname + _this.editid + '/', _this.editFormData)
+          .then(res => {
+            _this.editDataCancel()
+            _this.getSearchList()
+            if (res.status_code != 500) {
+              _this.$q.notify({
+                message: 'Success Edit Data',
+                icon: 'check',
+                color: 'green'
+              })
+            }
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+      },
+      editDataCancel() {
+        var _this = this
+        _this.editMode = false
+        _this.editid = 0
+        _this.editFormData = {
+          goods_code: '',
+          goods_desc: '',
+          goods_supplier: '',
+          goods_weight: '',
+          goods_w: '',
+          goods_d: '',
+          goods_h: '',
+          goods_unit: '',
+          goods_class: '',
+          goods_brand: '',
+          goods_color: '',
+          goods_shape: '',
+          goods_specs: '',
+          goods_origin: '',
+          goods_cost: '',
+          goods_price: '',
+          creater: ''
+        }
+      },
+      deleteData(e) {
+        var _this = this
+        _this.deleteForm = true
+        _this.deleteid = e
+      },
+      deleteDataSubmit() {
+        var _this = this
+        deleteauth(_this.pathname + _this.deleteid + '/')
+          .then(res => {
+            _this.deleteDataCancel()
+            _this.getSearchList()
+            _this.$q.notify({
+              message: 'Success Edit Data',
+              icon: 'check',
+              color: 'green'
+            })
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+      },
+      deleteDataCancel() {
+        var _this = this
+        _this.deleteForm = false
+        _this.deleteid = 0
+      },
+      viewData(e) {
+        var _this = this
+        var QRCode = require('qrcode')
+        QRCode.toDataURL(e.bar_code, [
+          {
+            errorCorrectionLevel: 'H',
+            mode: 'byte',
+            version: '2',
+            type: 'image/jpeg'
+          }
+        ])
+          .then(url => {
+            _this.goods_code = e.goods_code
+            _this.goods_desc = e.goods_desc
+            _this.bar_code = url
+          })
+          .catch(err => {
+            console.error(err)
+          })
+        _this.viewForm = true
+      },
+  
+      updateProxy() {
+        var _this = this
+        _this.proxyDate = _this.date
+      }
+  
+    },
+    created() {
+      var _this = this
+      if (LocalStorage.has('openid')) {
+        _this.openid = LocalStorage.getItem('openid')
+      } else {
+        _this.openid = ''
+        LocalStorage.set('openid', '')
+      }
+      if (LocalStorage.has('login_name')) {
+        _this.login_name = LocalStorage.getItem('login_name')
+      } else {
+        _this.login_name = ''
+        LocalStorage.set('login_name', '')
+      }
+      if (LocalStorage.has('auth')) {
+        const timeStamp = Date.now()
+        const formattedString = date.formatDate(timeStamp, 'YYYY/MM/DD')
+        _this.date = formattedString
+        console.log(_this.date)
+        _this.authin = '1'
+        _this.getList()
+      } else {
+        _this.authin = '0'
+      }
+    },
+    mounted() {
+      var _this = this
+      if (_this.$q.platform.is.electron) {
+        _this.height = String(_this.$q.screen.height - 290) + 'px'
+      } else {
+        _this.height = _this.$q.screen.height - 290 + '' + 'px'
+      }
+    },
+    updated() { },
+    destroyed() { },
+    // 在 watch 或方法中添加调试代码
+    watch: {
+      createDate1(val) {
+        if (val) {
+          if (val.to) {
+            this.createDate2 = `${val.from} - ${val.to}`
+            this.date_range = `${val.from},${val.to} `
+  
+            // this.downloadhUrl = this.pathname + 'filelist/?' + 'document_date__range=' + this.date_range
+          } else {
+            this.createDate2 = `${val}`
+            this.dateArray = val.split('/')
+            this.searchUrl = this.pathname + '?' + 'document_date__year=' + this.dateArray[0] + '&' + 'document_date__month=' + this.dateArray[1] + '&' + 'document_date__day=' + this.dateArray[2]
+            // this.downloadhUrl = this.pathname + 'filelist/?' + 'document_date__year=' + this.dateArray[0] + '&' + 'document_date__month=' + this.dateArray[1] + '&' + 'document_date__day=' + this.dateArray[2]
+          }
+          this.date_range = this.date_range.replace(/\//g, '-')
+  
+          this.getSearchList()
+          this.$refs.qDateProxy.hide()
+        }
+        else {
+          this.createDate2 = ''
+          this.date_range = ''
+          this.getSearchList()
+        }
+      }
+    }
+  }
+  </script>
+  <style scoped>
+  /* 添加在 <style> 中 */
+  .q-date__calendar-item--selected {
+    transition: all 0.3s ease;
+    background-color: #1976d2 !important;
+  }
+  
+  .q-date__range {
+    background-color: rgba(25, 118, 210, 0.1);
+  }
+  </style>

+ 955 - 0
templates/src/pages/container/containeroperate.vue

@@ -0,0 +1,955 @@
+<template>
+    <div style="margin-top: 42px;">
+  
+      <transition appear enter-active-class="animated fadeIn">
+        <q-table class="my-sticky-header-column-table shadow-24" :data="table_list" row-key="id" :separator="separator"
+          :loading="loading" :columns="columns" hide-bottom :pagination.sync="pagination" no-data-label="No data"
+          no-results-label="No data you want" :table-style="{ height: height }" flat bordered>
+          <template v-slot:top>
+            <q-btn-group push>
+              <q-btn :label="$t('new')" icon="add" @click="newForm = true">
+                <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                  content-style="font-size: 12px">{{ $t('newtip') }}</q-tooltip>
+              </q-btn>
+              <q-btn :label="$t('refresh')" icon="refresh" @click="reFresh()">
+                <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                  content-style="font-size: 12px">{{ $t('refreshtip') }}</q-tooltip>
+              </q-btn>
+              <q-btn :label="$t('downloadasnlist')" icon="cloud_download" @click="downloadlistData()">
+              </q-btn>
+            </q-btn-group>
+  
+            <q-space />
+  
+            <div class="flex items-center">
+              <div class="q-mr-md">{{ $t("download_center.createTime") }}</div>
+              <q-input readonly outlined dense v-model="createDate2" :placeholder="interval">
+                <template v-slot:append>
+                  <q-icon name="event" class="cursor-pointer">
+                    <q-popup-proxy ref="qDateProxy" transition-show="scale" transition-hide="scale">
+                      <q-date v-model="createDate1" range>
+                        <div class="row items-center justify-end q-gutter-sm">
+                          <q-btn :label="$t('index.cancel')" color="primary" flat v-close-popup />
+                          <q-btn :label="$t('index.clear')" color="primary" @click="createDate2 = ''; createDate1 = '';"
+                            v-close-popup />
+  
+                        </div>
+                      </q-date>
+                    </q-popup-proxy>
+                  </q-icon>
+                </template>
+              </q-input>
+              <q-btn-group push class="q-ml-md">
+              </q-btn-group>
+              <q-input outlined rounded dense debounce="300" color="primary" v-model="filter" :placeholder="$t('search')"
+                @input="getSearchList()" @keyup.enter="getSearchList()">
+                <template v-slot:append>
+                  <q-icon name="search" @click="getSearchList()" />
+                </template>
+              </q-input>
+            </div>
+          </template>
+          <template v-slot:body="props">
+            <q-tr :props="props">
+  
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="document_date" :props="props">
+                  <q-input dense outlined square v-model="editFormData.document_date"
+                    :label="$t('goods.view_goodslist.document_date')" autofocus
+                    :rules="[val => (val && val.length > 0) || error1]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="document_date" :props="props">{{ props.row.document_date }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="document_number" :props="props">
+                  <q-input dense outlined square v-model="editFormData.document_number"
+                    :label="$t('goods.view_goodslist.document_number')"
+                    :rules="[val => (val && val.length > 0) || error2]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="document_number" :props="props">{{ props.row.document_number }}</q-td>
+              </template>
+  
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="document_type" :props="props">
+                  <q-input dense outlined square v-model="editFormData.document_type"
+                    :label="$t('goods.view_goodslist.document_type')"
+                    :rules="[val => (val && val.length > 0) || error2]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="document_type" :props="props">{{ props.row.document_type }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="business_type" :props="props">
+                  <q-input dense outlined square v-model="editFormData.business_type"
+                    :label="$t('goods.view_goodslist.business_type')"
+                    :rules="[val => (val && val.length > 0) || error4]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="business_type" :props="props">{{ props.row.business_type }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="iout_type" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.iout_type"
+                    :label="$t('goods.view_goodslist.iout_type')" :rules="[val => (val && val > 0) || error5]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="iout_type" :props="props">{{ props.row.iout_type }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="department" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.department"
+                    :label="$t('goods.view_goodslist.department')" :rules="[val => (val && val > 0) || error6]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="department" :props="props">{{ props.row.department }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="warehouse_code" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.warehouse_code"
+                    :label="$t('goods.view_goodslist.warehouse_code')" :rules="[val => (val && val > 0) || error7]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="warehouse_code" :props="props">{{ props.row.warehouse_code }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="warehouse_name" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.warehouse_name"
+                    :label="$t('goods.view_goodslist.warehouse_name')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="warehouse_name" :props="props">{{ props.row.warehouse_name }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_code" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_code"
+                    :label="$t('goods.view_goodslist.goods_code')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_code" :props="props">{{ props.row.goods_code }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_desc" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_desc"
+                    :label="$t('goods.view_goodslist.goods_desc')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_desc" :props="props">{{ props.row.goods_desc }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_std" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_std"
+                    :label="$t('goods.view_goodslist.goods_std')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_std" :props="props">{{ props.row.goods_std }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_batch" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_batch"
+                    :label="$t('goods.view_goodslist.goods_batch')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_batch" :props="props">{{ props.row.goods_batch }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="in_batch" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.in_batch"
+                    :label="$t('goods.view_goodslist.in_batch')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="in_batch" :props="props">{{ props.row.in_batch }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="out_batch" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.out_batch"
+                    :label="$t('goods.view_goodslist.out_batch')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="out_batch" :props="props">{{ props.row.out_batch }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_unit" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_unit"
+                    :label="$t('goods.view_goodslist.goods_unit')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_unit" :props="props">{{ props.row.goods_unit }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_in" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_in" type="number"
+                    :label="$t('goods.view_goodslist.goods_in')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_in" :props="props">{{ props.row.goods_in }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_out" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_out" type="number"
+                    :label="$t('goods.view_goodslist.goods_out')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_out" :props="props">{{ props.row.goods_out }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="goods_notes" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.goods_notes"
+                    :label="$t('goods.view_goodslist.goods_notes')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="goods_notes" :props="props">{{ props.row.goods_notes }}</q-td>
+              </template>
+  
+              <template v-if="props.row.id === editid">
+                <q-td key="creator" :props="props">
+                  <q-input dense outlined square v-model.number="editFormData.creator"
+                    :label="$t('goods.view_goodslist.creator')" :rules="[val => (val && val > 0) || error8]" />
+                </q-td>
+              </template>
+              <template v-else-if="props.row.id !== editid">
+                <q-td key="creator" :props="props">{{ props.row.creator }}</q-td>
+              </template>
+  
+  
+              <template v-if="!editMode">
+                <q-td key="action" :props="props" style="width: 100px">
+                  <q-btn round flat push color="info" icon="print" @click="viewData(props.row)">
+                    <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                      content-style="font-size: 12px">
+                      {{ $t('goods.view_goodslist.print_goods_label') }}
+                    </q-tooltip>
+                  </q-btn>
+                  <q-btn round flat push color="purple" icon="edit" @click="editData(props.row)">
+                    <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                      content-style="font-size: 12px">{{ $t('edit') }}</q-tooltip>
+                  </q-btn>
+                  <q-btn round flat push color="dark" icon="delete" @click="deleteData(props.row.id)">
+                    <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                      content-style="font-size: 12px">{{ $t('delete') }}</q-tooltip>
+                  </q-btn>
+                </q-td>
+              </template>
+              <template v-else-if="editMode">
+                <template v-if="props.row.id === editid">
+                  <q-td key="action" :props="props" style="width: 100px">
+                    <q-btn round flat push color="secondary" icon="check" @click="editDataSubmit()">
+                      <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                        content-style="font-size: 12px">{{ $t('confirmedit') }}</q-tooltip>
+                    </q-btn>
+                    <q-btn round flat push color="red" icon="close" @click="editDataCancel()">
+                      <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
+                        content-style="font-size: 12px">{{ $t('canceledit') }}</q-tooltip>
+                    </q-btn>
+                  </q-td>
+                </template>
+                <template v-else-if="props.row.id !== editid"></template>
+              </template>
+            </q-tr>
+          </template>
+        </q-table>
+      </transition>
+      <template>
+        <div v-show="max !== 0" class="q-pa-lg flex flex-center">
+          <div>{{ total }} </div>
+          <q-pagination v-model="current" color="black" :max="max" :max-pages="6" boundary-links
+            @click="getSearchList(current); paginationIpt = current" />
+          <div>
+            <input v-model="paginationIpt" @blur="changePageEnter" @keyup.enter="changePageEnter"
+              style="width: 60px; text-align: center" />
+          </div>
+        </div>
+        <div v-show="max === 0" class="q-pa-lg flex flex-center">
+          <q-btn flat push color="dark" :label="$t('no_data')"></q-btn>
+        </div>
+      </template>
+      <q-dialog v-model="newForm">
+        <q-card class="shadow-24">
+          <q-bar class="bg-light-blue-10 text-white rounded-borders" style="height: 50px">
+            <div>{{ $t('newtip') }}</div>
+            <q-space />
+            <q-btn dense flat icon="close" v-close-popup>
+              <q-tooltip content-class="bg-amber text-black shadow-4">{{ $t('index.close') }}</q-tooltip>
+            </q-btn>
+          </q-bar>
+          <q-card-section style="max-height: 325px; width: 400px" class="scroll">
+            <q-input dense outlined square v-model="newFormData.goods_code" :label="$t('goods.view_goodslist.goods_code')"
+              autofocus :rules="[val => (val && val.length > 0) || error1]" @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model="newFormData.goods_desc" :label="$t('goods.view_goodslist.goods_desc')"
+              :rules="[val => (val && val.length > 0) || error2]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_supplier" :options="supplier_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_supplier')"
+              :rules="[val => (val && val.length > 0) || error3]" @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_weight" type="number"
+              :label="$t('goods.view_goodslist.goods_weight')" :rules="[val => (val && val > 0) || error4]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_w" type="number"
+              :label="$t('goods.view_goodslist.goods_w')" :rules="[val => (val && val > 0) || error5]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_d" type="number"
+              :label="$t('goods.view_goodslist.goods_d')" :rules="[val => (val && val > 0) || error6]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_h" type="number"
+              :label="$t('goods.view_goodslist.goods_h')" :rules="[val => (val && val > 0) || error7]"
+              @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_unit" :options="goods_unit_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_unit')"
+              :rules="[val => (val && val.length > 0) || error8]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_class" :options="goods_class_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_class')"
+              :rules="[val => (val && val.length > 0) || error9]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_brand" :options="goods_brand_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_brand')"
+              :rules="[val => (val && val.length > 0) || error10]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_color" :options="goods_color_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_color')"
+              :rules="[val => (val && val.length > 0) || error11]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_shape" :options="goods_shape_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_shape')"
+              :rules="[val => (val && val.length > 0) || error12]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_specs" :options="goods_specs_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_specs')"
+              :rules="[val => (val && val.length > 0) || error13]" @keyup.enter="newDataSubmit()" />
+            <q-select dense outlined square v-model="newFormData.goods_origin" :options="goods_origin_list"
+              transition-show="scale" transition-hide="scale" :label="$t('goods.view_goodslist.goods_origin')"
+              :rules="[val => (val && val.length > 0) || error14]" @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_cost" type="number"
+              :label="$t('goods.view_goodslist.goods_cost')" :rules="[val => (val && val > 0) || error15]"
+              @keyup.enter="newDataSubmit()" />
+            <q-input dense outlined square v-model.number="newFormData.goods_price" type="number"
+              :label="$t('goods.view_goodslist.goods_price')" :rules="[val => (val && val > 0) || error16]"
+              @keyup.enter="newDataSubmit()" />
+          </q-card-section>
+          <div style="float: right; padding: 15px 15px 15px 0">
+            <q-btn color="white" text-color="black" style="margin-right: 25px" @click="newDataCancel()">{{ $t('cancel')
+            }}</q-btn>
+            <q-btn color="primary" @click="newDataSubmit()">{{ $t('submit') }}</q-btn>
+          </div>
+        </q-card>
+      </q-dialog>
+      <q-dialog v-model="deleteForm">
+        <q-card class="shadow-24">
+          <q-bar class="bg-light-blue-10 text-white rounded-borders" style="height: 50px">
+            <div>{{ $t('delete') }}</div>
+            <q-space />
+            <q-btn dense flat icon="close" v-close-popup>
+              <q-tooltip>{{ $t('index.close') }}</q-tooltip>
+            </q-btn>
+          </q-bar>
+          <q-card-section style="max-height: 325px; width: 400px" class="scroll">{{ $t('deletetip') }}</q-card-section>
+          <div style="float: right; padding: 15px 15px 15px 0">
+            <q-btn color="white" text-color="black" style="margin-right: 25px" @click="deleteDataCancel()">{{ $t('cancel')
+            }}</q-btn>
+            <q-btn color="primary" @click="deleteDataSubmit()">{{ $t('submit') }}</q-btn>
+          </div>
+        </q-card>
+      </q-dialog>
+      <q-dialog v-model="viewForm">
+        <div id="printMe" style="width: 400px;height:280px;background-color: white">
+          <q-card-section>
+            <div class="row" style="height: 50px">
+              <div class="col-3"><img src="statics/goods/logo.png"
+                  style="width: 60px;height: 50px;margin-top: 5px;margin-left: 5px" /></div>
+              <div class="col-9" style="height: 50px;float: contour;margin-top: 10px">
+                <p style="font-size: 20px;font-weight: 550">{{ $t('goods.view_goodslist.goods_code') + ':' + goods_code }}
+                </p>
+              </div>
+            </div>
+            <hr />
+            <div class="row">
+              <div class="col-8" style="margin-top: 30px;padding-left: 3%">
+                <p style="font-size: 20px;font-weight: 550">{{ $t('goods.view_goodslist.goods_name') + ':' }}</p>
+                <p style="font-size: 20px;font-weight: 550">{{ goods_desc }}</p>
+              </div>
+              <div class="col-4" style="margin-top: 25px;"><img :src="bar_code" style="width: 70%;margin-left: 23px" />
+              </div>
+            </div>
+          </q-card-section>
+        </div>
+        <div style="float: right; padding: 15px 15px 15px 0"><q-btn color="primary" icon="print"
+            v-print="printObj">print</q-btn></div>
+      </q-dialog>
+    </div>
+  </template>
+  <router-view />
+  
+  <script>
+  import { getauth, postauth, putauth, deleteauth } from 'boot/axios_request'
+  import { date, exportFile, LocalStorage } from 'quasar'
+  
+  
+  export default {
+    name: 'Pageflowlist',
+    data() {
+      return {
+        createDate1: '',
+        createDate2: '',
+        date_range: '',
+        proxyDate: '',
+        date: '',
+        goods_code: '',
+        goods_desc: '',
+        openid: '',
+        login_name: '',
+        authin: '0',
+        searchUrl: '',
+        pathname: 'reportcenter/flow/',
+        pathfilename: 'reportcenter/file/',
+  
+        pathname_previous: '',
+        pathname_next: '',
+        separator: 'cell',
+        loading: false,
+        height: '',
+        viewForm: false,
+        printObj: {
+          id: 'printMe',
+          popTitle: this.$t('inbound.asn')
+        },
+        table_list: [],
+  
+        columns: [
+          { name: 'document_date', required: true, label: '单据日期', align: 'left', field: 'goods_code' },
+          { name: 'document_number', label: '单据编号', field: 'goods_desc', align: 'center' },
+          { name: 'document_type', label: '单据类型', field: 'goods_supplier', align: 'center' },
+          { name: 'business_type', label: '业务类型', field: 'goods_weight', align: 'center' },
+          { name: 'iout_type', label: '出入库类型', field: 'iout_type', align: 'center' },
+          { name: 'department', label: '部门', field: 'department', align: 'center' },
+          { name: 'warehouse_code', label: '仓库编码', field: 'warehouse_code', align: 'center' },
+          { name: 'warehouse_name', label: '仓库名称', field: 'warehouse_name', align: 'center' },
+          { name: 'goods_code', label: '存货编码', field: 'goods_code', align: 'center' },
+          { name: 'goods_desc', label: '存货', field: 'goods_desc', align: 'center' },
+          { name: 'goods_std', label: '规格型号', field: 'goods_std', align: 'center' },
+          { name: 'goods_batch', label: '批号', field: 'goods_batch', align: 'center' },
+          { name: 'in_batch', label: '入库批号', field: 'in_batch', align: 'center' },
+          { name: 'out_batch', label: '出库批号', field: 'out_batch', align: 'center' },
+          { name: 'goods_unit', label: '计量单位', field: 'goods_unit', align: 'center' },
+          { name: 'goods_in', label: '本期入库', field: 'goods_in', align: 'center' },
+          { name: 'goods_out', label: '本期出库', field: 'goods_out', align: 'center' },
+          { name: 'goods_notes', label: '备注', field: 'goods_notes', align: 'center' },
+          { name: 'creator', label: '创建人', field: 'creator', align: 'center' },
+          { name: 'action', label: '操作', align: 'center' }
+        ],
+        filter: '',
+        pagination: {
+          page: 1,
+          rowsPerPage: 11
+        },
+        newForm: false,
+        newFormData: {
+          document_date: '',
+          document_number: '',
+          document_type: '',
+          business_type: '',
+          iout_type: '',
+          department: '',
+          warehouse_code: '',
+          warehouse_name: '',
+          goods_code: '',
+          goods_desc: '',
+          goods_std: '',
+          goods_batch: '',
+          in_batch: '',
+          out_batch: '',
+          goods_unit: '',
+          goods_in: '',
+          goods_out: '',
+          goods_notes: '',
+          creator: ''
+        },
+        editid: 0,
+        editFormData: {},
+        editMode: false,
+        deleteForm: false,
+        deleteid: 0,
+        bar_code: '',
+        error1: this.$t('goods.view_goodslist.error1'),
+        error2: this.$t('goods.view_goodslist.error2'),
+        error3: this.$t('goods.view_goodslist.error3'),
+        error4: this.$t('goods.view_goodslist.error4'),
+        error5: this.$t('goods.view_goodslist.error5'),
+        error6: this.$t('goods.view_goodslist.error6'),
+        error7: this.$t('goods.view_goodslist.error7'),
+        error8: this.$t('goods.view_unit.error1'),
+        error9: this.$t('goods.view_class.error1'),
+        error10: this.$t('goods.view_brand.error1'),
+        error11: this.$t('goods.view_color.error1'),
+        error12: this.$t('goods.view_shape.error1'),
+        error13: this.$t('goods.view_specs.error1'),
+        error14: this.$t('goods.view_origin.error1'),
+        error15: this.$t('goods.view_goodslist.error8'),
+        error16: this.$t('goods.view_goodslist.error9'),
+        current: 1,
+        max: 0,
+        total: 0,
+        paginationIpt: 1,
+        current: 1,
+  
+      }
+  
+    },
+    computed: {
+      interval() {
+        return this.$t('download_center.start') + ' - ' + this.$t('download_center.end')
+      }
+    },
+    methods: {
+      getList(params = {}) {
+        var _this = this
+        _this.loading = true
+        // 合并基础参数
+        const baseParams = {
+          page: _this.current,
+          page_size: _this.pagination.rowsPerPage
+        }
+  
+        // 创建URLSearchParams处理参数
+        const queryParams = new URLSearchParams({
+          ...baseParams,
+          ...params
+        })
+        console.log(queryParams)
+        // 过滤空值参数
+        Array.from(queryParams.entries()).forEach(([key, value]) => {
+          if (value === '' || value === null || value === undefined) {
+            queryParams.delete(key)
+          }
+        })
+  
+        getauth(`${_this.pathname}?${queryParams}`)
+          .then(res => {
+            _this.table_list = res.results
+            _this.total = res.count
+            _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage) || 0
+            _this.pathname_previous = res.previous
+            _this.pathname_next = res.next
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+          .finally(() => {
+            _this.loading = false
+          })
+      },
+      changePageEnter() {
+        if (Number(this.paginationIpt) < 1) {
+          this.current = 1
+          this.paginationIpt = 1
+        } else if (Number(this.paginationIpt) > this.max) {
+          this.current = this.max
+          this.paginationIpt = this.max
+        } else {
+          this.current = Number(this.paginationIpt)
+        }
+        this.getSearchList(this.current)
+      },
+  
+      // 带搜索条件加载
+      getSearchList(page = 1) {
+        this.current = page
+        this.paginationIpt = page
+        this.getList({
+          goods_desc__icontains: this.filter,
+          document_date__range: this.date_range
+        })
+      },
+      downloadlistData() {
+        this.getfileList()
+  
+      },
+      getfileList() {
+        var _this = this
+        _this.loading = true
+        const params = {
+          goods_desc__icontains: _this.filter,
+          document_date__range: _this.date_range
+        }
+        const queryParams = new URLSearchParams({
+          ...params
+        })
+        console.log(queryParams)
+        // 过滤空值参数
+        Array.from(queryParams.entries()).forEach(([key, value]) => {
+          if (value === '' || value === null || value === undefined) {
+            queryParams.delete(key)
+          }
+        })
+        console.log(`${_this.pathfilename}?${queryParams}`)
+        getauth(`${_this.pathfilename}?${queryParams}`)
+          .then(res => {
+            var timeStamp = Date.now()
+            var formattedString = date.formatDate(timeStamp, 'YYYYMMDDHHmmss')
+            const status = exportFile(_this.pathfilename + 'list' + formattedString + '.csv', '\uFEFF' + res, 'text/csv')
+            if (status !== true) {
+              _this.$q.notify({
+                message: 'Browser denied file download...',
+                color: 'negative',
+                icon: 'warning'
+              })
+            }
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+          .finally(() => {
+            _this.loading = false
+          })
+      },
+  
+      getListPrevious() {
+        var _this = this
+        if (LocalStorage.has('auth')) {
+          getauth(_this.pathname_previous, {})
+            .then(res => {
+              _this.table_list = res.results
+              _this.pathname_previous = res.previous
+              _this.pathname_next = res.next
+            })
+            .catch(err => {
+              _this.$q.notify({
+                message: err.detail,
+                icon: 'close',
+                color: 'negative'
+              })
+            })
+        } else {
+        }
+      },
+      getListNext() {
+        var _this = this
+        if (LocalStorage.has('auth')) {
+          getauth(_this.pathname_next, {})
+            .then(res => {
+              _this.table_list = res.results
+  
+              _this.pathname_previous = res.previous
+              _this.pathname_next = res.next
+            })
+            .catch(err => {
+              _this.$q.notify({
+                message: err.detail,
+                icon: 'close',
+                color: 'negative'
+              })
+            })
+        }
+      },
+      reFresh() {
+        var _this = this
+        _this.getSearchList()
+      },
+  
+      newDataSubmit() {
+        var _this = this
+        var goodscodes = []
+        _this.table_list.forEach(i => {
+          goodscodes.push(i.goods_code)
+        })
+        if (goodscodes.indexOf(_this.newFormData.goods_code) === -1 && _this.newFormData.goods_code.length !== 0) {
+          _this.newFormData.creater = _this.login_name
+          postauth(_this.pathname, _this.newFormData)
+            .then(res => {
+              _this.getSearchList()
+              _this.newDataCancel()
+              if (res.status_code != 500) {
+                _this.$q.notify({
+                  message: 'Success Create',
+                  icon: 'check',
+                  color: 'green'
+                })
+              }
+            })
+            .catch(err => {
+              _this.$q.notify({
+                message: err.detail,
+                icon: 'close',
+                color: 'negative'
+              })
+            })
+        } else if (goodscodes.indexOf(_this.newFormData.goods_code) !== -1) {
+          _this.$q.notify({
+            message: _this.$t('notice.goodserror.goods_listerror'),
+            icon: 'close',
+            color: 'negative'
+          })
+        } else if (_this.newFormData.goods_code.length === 0) {
+          _this.$q.notify({
+            message: _this.$t('goods.view_goodslist.error1'),
+            icon: 'close',
+            color: 'negative'
+          })
+        }
+        goodscodes = []
+      },
+      newDataCancel() {
+        var _this = this
+        _this.newForm = false
+        _this.newFormData = {
+          goods_code: '',
+          goods_desc: '',
+          goods_supplier: '',
+          goods_weight: '',
+          goods_w: '',
+          goods_d: '',
+          goods_h: '',
+          goods_unit: '',
+          goods_class: '',
+          goods_brand: '',
+          goods_color: '',
+          goods_shape: '',
+          goods_specs: '',
+          goods_origin: '',
+          goods_cost: '',
+          goods_price: '',
+          creater: ''
+        }
+      },
+      editData(e) {
+        var _this = this
+        _this.editMode = true
+        _this.editid = e.id
+        _this.editFormData = {
+          goods_code: e.goods_code,
+          goods_desc: e.goods_desc,
+          goods_supplier: e.goods_supplier,
+          goods_weight: e.goods_weight,
+          goods_w: e.goods_w,
+          goods_d: e.goods_d,
+          goods_h: e.goods_h,
+          goods_unit: e.goods_unit,
+          goods_class: e.goods_class,
+          goods_brand: e.goods_brand,
+          goods_color: e.goods_color,
+          goods_shape: e.goods_shape,
+          goods_specs: e.goods_specs,
+          goods_origin: e.goods_origin,
+          goods_cost: e.goods_cost,
+          goods_price: e.goods_price,
+          creater: _this.login_name,
+          bar_code: e.bar_code
+        }
+      },
+      editDataSubmit() {
+        var _this = this
+        putauth(_this.pathname + _this.editid + '/', _this.editFormData)
+          .then(res => {
+            _this.editDataCancel()
+            _this.getSearchList()
+            if (res.status_code != 500) {
+              _this.$q.notify({
+                message: 'Success Edit Data',
+                icon: 'check',
+                color: 'green'
+              })
+            }
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+      },
+      editDataCancel() {
+        var _this = this
+        _this.editMode = false
+        _this.editid = 0
+        _this.editFormData = {
+          goods_code: '',
+          goods_desc: '',
+          goods_supplier: '',
+          goods_weight: '',
+          goods_w: '',
+          goods_d: '',
+          goods_h: '',
+          goods_unit: '',
+          goods_class: '',
+          goods_brand: '',
+          goods_color: '',
+          goods_shape: '',
+          goods_specs: '',
+          goods_origin: '',
+          goods_cost: '',
+          goods_price: '',
+          creater: ''
+        }
+      },
+      deleteData(e) {
+        var _this = this
+        _this.deleteForm = true
+        _this.deleteid = e
+      },
+      deleteDataSubmit() {
+        var _this = this
+        deleteauth(_this.pathname + _this.deleteid + '/')
+          .then(res => {
+            _this.deleteDataCancel()
+            _this.getSearchList()
+            _this.$q.notify({
+              message: 'Success Edit Data',
+              icon: 'check',
+              color: 'green'
+            })
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+      },
+      deleteDataCancel() {
+        var _this = this
+        _this.deleteForm = false
+        _this.deleteid = 0
+      },
+      viewData(e) {
+        var _this = this
+        var QRCode = require('qrcode')
+        QRCode.toDataURL(e.bar_code, [
+          {
+            errorCorrectionLevel: 'H',
+            mode: 'byte',
+            version: '2',
+            type: 'image/jpeg'
+          }
+        ])
+          .then(url => {
+            _this.goods_code = e.goods_code
+            _this.goods_desc = e.goods_desc
+            _this.bar_code = url
+          })
+          .catch(err => {
+            console.error(err)
+          })
+        _this.viewForm = true
+      },
+  
+      updateProxy() {
+        var _this = this
+        _this.proxyDate = _this.date
+      }
+  
+    },
+    created() {
+      var _this = this
+      if (LocalStorage.has('openid')) {
+        _this.openid = LocalStorage.getItem('openid')
+      } else {
+        _this.openid = ''
+        LocalStorage.set('openid', '')
+      }
+      if (LocalStorage.has('login_name')) {
+        _this.login_name = LocalStorage.getItem('login_name')
+      } else {
+        _this.login_name = ''
+        LocalStorage.set('login_name', '')
+      }
+      if (LocalStorage.has('auth')) {
+        const timeStamp = Date.now()
+        const formattedString = date.formatDate(timeStamp, 'YYYY/MM/DD')
+        _this.date = formattedString
+        console.log(_this.date)
+        _this.authin = '1'
+        _this.getList()
+      } else {
+        _this.authin = '0'
+      }
+    },
+    mounted() {
+      var _this = this
+      if (_this.$q.platform.is.electron) {
+        _this.height = String(_this.$q.screen.height - 290) + 'px'
+      } else {
+        _this.height = _this.$q.screen.height - 290 + '' + 'px'
+      }
+    },
+    updated() { },
+    destroyed() { },
+    // 在 watch 或方法中添加调试代码
+    watch: {
+      createDate1(val) {
+        if (val) {
+          if (val.to) {
+            this.createDate2 = `${val.from} - ${val.to}`
+            this.date_range = `${val.from},${val.to} `
+  
+            // this.downloadhUrl = this.pathname + 'filelist/?' + 'document_date__range=' + this.date_range
+          } else {
+            this.createDate2 = `${val}`
+            this.dateArray = val.split('/')
+            this.searchUrl = this.pathname + '?' + 'document_date__year=' + this.dateArray[0] + '&' + 'document_date__month=' + this.dateArray[1] + '&' + 'document_date__day=' + this.dateArray[2]
+            // this.downloadhUrl = this.pathname + 'filelist/?' + 'document_date__year=' + this.dateArray[0] + '&' + 'document_date__month=' + this.dateArray[1] + '&' + 'document_date__day=' + this.dateArray[2]
+          }
+          this.date_range = this.date_range.replace(/\//g, '-')
+  
+          this.getSearchList()
+          this.$refs.qDateProxy.hide()
+        }
+        else {
+          this.createDate2 = ''
+          this.date_range = ''
+          this.getSearchList()
+        }
+      }
+    }
+  }
+  </script>
+  <style scoped>
+  /* 添加在 <style> 中 */
+  .q-date__calendar-item--selected {
+    transition: all 0.3s ease;
+    background-color: #1976d2 !important;
+  }
+  
+  .q-date__range {
+    background-color: rgba(25, 118, 210, 0.1);
+  }
+  </style>

+ 20 - 0
templates/src/router/routes.js

@@ -140,6 +140,26 @@ const routes = [{
       }
       ]
     },
+    {
+      path: 'container',
+      name: 'container',
+      component: () => import('pages/container/container.vue'),
+      children: [{
+        path: 'containerlist',
+        name: 'containerlist',
+        component: () => import('pages/container/containerlist.vue')
+      },
+      {
+        path: 'containerdetail',
+        name: 'containerdetail',
+        component: () => import('pages/container/containerdetail.vue')
+      },
+      { path:'containeroperate',
+        name:'containeroperate',
+        component: () => import('pages/container/containeroperate.vue')
+      }
+    ]
+    },
     {
       path: 'outbound',
       name: 'outbound',

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 ['/asn/list/']:
+        elif request.path in ['/container/container_wcs/',]:
             return True
         else:
             ip = request.META.get('HTTP_X_FORWARDED_FOR') if request.META.get(