ソースを参照

托盘操作历史完成

flower_mr 2 ヶ月 前
コミット
ec05c06707

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


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


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


+ 18 - 0
container/migrations/0004_containeroperationmodel_is_delete.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.1.2 on 2025-04-06 13:35
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('container', '0003_containerdetailmodel_is_delete'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='containeroperationmodel',
+            name='is_delete',
+            field=models.BooleanField(default=False, verbose_name='是否删除'),
+        ),
+    ]

BIN
container/migrations/__pycache__/0004_containeroperationmodel_is_delete.cpython-38.pyc


+ 2 - 0
container/models.py

@@ -72,6 +72,8 @@ class ContainerOperationModel(models.Model):
     from_location = models.CharField(max_length=50, null=True, verbose_name='原库位')
     to_location = models.CharField(max_length=50, null=True, verbose_name='目标库位')
     memo = models.TextField(null=True, verbose_name='备注')
+    is_delete = models.BooleanField(default=False, verbose_name='是否删除')
+
 
     class Meta:
         db_table = 'container_operation'    

+ 3 - 3
container/serializers.py

@@ -117,15 +117,15 @@ class ContainerOperationGetSerializer(serializers.ModelSerializer):
     from_location = serializers.CharField(read_only=True, required=False)
     to_location = serializers.CharField(read_only=True, required=False)
     memo = serializers.CharField(read_only=True, required=False)
-    def get_container_code(self, obj):
+    def get_container(self, obj):
         """ 动态序列化关联的主单数据 """
         from .serializers import ContainerListGetSerializer
-        return ContainerListGetSerializer(obj.container_list).data
+        return ContainerListGetSerializer(obj.container).data
 
     def get_batch(self, obj):
         """ 动态序列化关联的批次数据 """
         from bound.serializers import BoundBatchGetSerializer
-        return BoundBatchGetSerializer(obj.bound_batch).data
+        return BoundBatchGetSerializer(obj.batch).data
 
     class Meta:
         # 指定模型和排除字段

+ 3 - 4
container/views.py

@@ -162,7 +162,6 @@ class ContainerWCSViewSet(viewsets.ModelViewSet):
             }
         return Response(data_return)
 
-
 class ContainerDetailViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -366,7 +365,7 @@ class ContainerDetailViewSet(viewsets.ModelViewSet):
         headers = self.get_success_headers(serializer.data)
         return Response(serializer.data, status=200, headers=headers)
 
-class ContainerOperationViewSet(viewsets.ModelViewSet):
+class ContainerOperateViewSet(viewsets.ModelViewSet):
     """
         retrieve:
             Response a data list(get)
@@ -429,5 +428,5 @@ class ContainerOperationViewSet(viewsets.ModelViewSet):
         serializer.save()
         headers = self.get_success_headers(serializer.data)
         return Response(serializer.data, status=200, headers=headers)
-    
-            
+
+        

BIN
db.sqlite3


+ 184 - 0
logs/error.log

@@ -1777,3 +1777,187 @@ Traceback (most recent call last):
   File "D:\Document\code\vue\greater_wms\.\container\serializers.py", line 56, in get_container
     return ContainerListGetSerializer(obj.container_list).data
 AttributeError: 'ContainerDetailModel' object has no attribute 'container_list'
+[2025-04-06 13:34:49,030][django.request.log_response():241] [ERROR] Internal Server Error: /container/operate/
+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 400, in get_queryset
+    return ContainerOperationModel.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: batch, batch_id, container, container_id, from_location, goods_code, goods_desc, goods_qty, goods_weight, id, memo, month, operation_type, operator, timestamp, to_location
+[2025-04-06 13:35:52,776][django.request.log_response():241] [ERROR] Internal Server Error: /container/operate/
+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 43, in list
+    return self.get_paginated_response(serializer.data)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 768, in data
+    ret = super().data
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
+    self.child.to_representation(item) for item in iterable
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 522, in to_representation
+    ret[field.field_name] = field.to_representation(attribute)
+  File "d:\language\python38\lib\site-packages\rest_framework\fields.py", line 1837, in to_representation
+    method = getattr(self.parent, self.method_name)
+AttributeError: 'ContainerOperationGetSerializer' object has no attribute 'get_container'
+[2025-04-06 13:37:00,582][django.request.log_response():241] [ERROR] Internal Server Error: /container/operate/
+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 43, in list
+    return self.get_paginated_response(serializer.data)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 768, in data
+    ret = super().data
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
+    self.child.to_representation(item) for item in iterable
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 522, in to_representation
+    ret[field.field_name] = field.to_representation(attribute)
+  File "d:\language\python38\lib\site-packages\rest_framework\fields.py", line 1838, in to_representation
+    return method(value)
+  File "D:\Document\code\vue\greater_wms\.\container\serializers.py", line 123, in get_container
+    return ContainerListGetSerializer(obj.container_list).data
+AttributeError: 'ContainerOperationModel' object has no attribute 'container_list'
+[2025-04-06 13:37:03,663][django.request.log_response():241] [ERROR] Internal Server Error: /container/operate/
+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 43, in list
+    return self.get_paginated_response(serializer.data)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 768, in data
+    ret = super().data
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
+    self.child.to_representation(item) for item in iterable
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 522, in to_representation
+    ret[field.field_name] = field.to_representation(attribute)
+  File "d:\language\python38\lib\site-packages\rest_framework\fields.py", line 1838, in to_representation
+    return method(value)
+  File "D:\Document\code\vue\greater_wms\.\container\serializers.py", line 123, in get_container
+    return ContainerListGetSerializer(obj.container_list).data
+AttributeError: 'ContainerOperationModel' object has no attribute 'container_list'

+ 193 - 0
logs/server.log

@@ -1836,3 +1836,196 @@ Traceback (most recent call last):
     return ContainerListGetSerializer(obj.container_list).data
 AttributeError: 'ContainerDetailModel' object has no attribute 'container_list'
 [2025-04-03 11:38:25,558][django.request.log_response():241] [WARNING] Not Found: /container/operate/
+[2025-04-06 13:34:49,030][django.request.log_response():241] [ERROR] Internal Server Error: /container/operate/
+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 400, in get_queryset
+    return ContainerOperationModel.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: batch, batch_id, container, container_id, from_location, goods_code, goods_desc, goods_qty, goods_weight, id, memo, month, operation_type, operator, timestamp, to_location
+[2025-04-06 13:35:52,776][django.request.log_response():241] [ERROR] Internal Server Error: /container/operate/
+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 43, in list
+    return self.get_paginated_response(serializer.data)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 768, in data
+    ret = super().data
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
+    self.child.to_representation(item) for item in iterable
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 522, in to_representation
+    ret[field.field_name] = field.to_representation(attribute)
+  File "d:\language\python38\lib\site-packages\rest_framework\fields.py", line 1837, in to_representation
+    method = getattr(self.parent, self.method_name)
+AttributeError: 'ContainerOperationGetSerializer' object has no attribute 'get_container'
+[2025-04-06 13:37:00,582][django.request.log_response():241] [ERROR] Internal Server Error: /container/operate/
+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 43, in list
+    return self.get_paginated_response(serializer.data)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 768, in data
+    ret = super().data
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
+    self.child.to_representation(item) for item in iterable
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 522, in to_representation
+    ret[field.field_name] = field.to_representation(attribute)
+  File "d:\language\python38\lib\site-packages\rest_framework\fields.py", line 1838, in to_representation
+    return method(value)
+  File "D:\Document\code\vue\greater_wms\.\container\serializers.py", line 123, in get_container
+    return ContainerListGetSerializer(obj.container_list).data
+AttributeError: 'ContainerOperationModel' object has no attribute 'container_list'
+[2025-04-06 13:37:03,663][django.request.log_response():241] [ERROR] Internal Server Error: /container/operate/
+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 43, in list
+    return self.get_paginated_response(serializer.data)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 768, in data
+    ret = super().data
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
+    self.child.to_representation(item) for item in iterable
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 522, in to_representation
+    ret[field.field_name] = field.to_representation(attribute)
+  File "d:\language\python38\lib\site-packages\rest_framework\fields.py", line 1838, in to_representation
+    return method(value)
+  File "D:\Document\code\vue\greater_wms\.\container\serializers.py", line 123, in get_container
+    return ContainerListGetSerializer(obj.container_list).data
+AttributeError: 'ContainerOperationModel' object has no attribute 'container_list'
+[2025-04-06 14:54:39,067][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-06 17:23:37,307][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-06 17:23:41,901][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-06 22:08:37,671][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-06 22:25:38,548][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-06 22:25:39,087][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 13:52:13,592][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 13:52:16,669][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 13:52:25,477][django.request.log_response():241] [WARNING] Not Found: /dn/list/

+ 227 - 59
templates/src/pages/container/containerlist.vue

@@ -218,60 +218,101 @@
                       <q-card class="q-mb-md" bordered>
 
                         <q-card-section>
-                          <template >
-                            <div class="text-h6 q-mb-md">{{ "托盘物料" }}</div>
-                            <template v-if=" table_detail.length > 0">
-                              <div 
-                                v-for="(item, index) in table_detail" 
-                                :key="index"
-                                class="row q-col-gutter-md q-mb-sm"
-                              >             
-                                  <div class="col"    style="min-width: 150px">
-                                    <q-input 
-                                      v-model="item.batch.bound_number" 
-                                      :label="'批次'" 
-                                      :readonly="onlyread" 
-                                      dense outlined 
-                                
-                                    />
-                                  </div>
-                                  <div class="col">
-                                    <q-input 
-                                      v-model="item.batch.goods_desc" 
-                                      :label="'货物'"
-                                      :readonly="onlyread" 
-                                      dense outlined 
-                                    />
-                                  </div>
-                                  <div class="col">
-                                    <q-input 
-                                      v-model="item.batch.goods_weight" 
-                                      :label="'单重'"
-                                      :readonly="onlyread" 
-                                      dense outlined 
-                                    />
-                                  </div>
-                                  <div class="col">
-                                    <q-input 
-                                      v-model="item.batch.goods_qty" 
-                                      :label="'数量'"
-                                      :readonly="onlyread" 
-                                      dense outlined 
-                                    />
-                                  </div>
-                                  <div class="col">
-                                    <q-input 
-                                      v-model="item.batch.creater" 
-                                      :label="'组盘'"
-                                      :readonly="onlyread" 
-                                      dense outlined 
-                                    />
-                                  </div>
+                          <template>
+                    <div class="text-h6 q-mb-md" style="display: flex; justify-content: space-between;">
+                          {{ "操作记录" }}
+                          <q-btn class="q-ml-sm" color="primary" icon="event" @click="sortoperatedetail">近一个月操作记录</q-btn>
+                        </div>
+                            <template v-if="listSize > 0">
+                              <q-list bordered class="rounded-borders">
+                                <q-expansion-item
+                                  v-for="(node, index) in nodeList"
+                                  :key="index"
+                                  group="op-group"
+                                  :caption="`操作类型: ${formatType(node.value[0].operation_type)} ----- 操作时间:${node.value[0].timestamp }`"  
+                         
+                          
+                                      
+                                >
+                                  <!-- 展开后的详细信息 -->
+                                  <q-card>
+                                    <q-card-section>
+                                  
+                                      <div 
+                                        v-for="(item, detailindex) in node.value" 
+                                        :key="detailindex"
+                                        class="row q-col-gutter-md q-mb-sm"
+                                        style="display: flex; justify-content: space-between;"
+                                      >             
+                                          <div class="col"    style="min-width: 150px">
+                                            <q-input 
+                                              v-model="item.batch.bound_number" 
+                                              :label="'批次'" 
+                                              :readonly="onlyread" 
+                                              dense outlined 
+                                        
+                                            />
+                                          </div>
+                                          <div class="col">
+                                            <q-input 
+                                              v-model="item.batch.goods_desc" 
+                                              :label="'货物'"
+                                              :readonly="onlyread" 
+                                              dense outlined 
+                                            />
+                                          </div>
+                                          <div class="col">
+                                            <q-input 
+                                              v-model="item.batch.goods_weight" 
+                                              :label="'单重'"
+                                              :readonly="onlyread" 
+                                              dense outlined 
+                                            />
+                                          </div>
+                                          <div class="col">
+                                            <q-input 
+                                              v-model="item.batch.goods_qty" 
+                                              :label="'数量'"
+                                              :readonly="onlyread" 
+                                              dense outlined 
+                                            />
+                                          </div>
+                                          <div class="col">
+                                            <q-input 
+                                              v-model="item.operator" 
+                                              :label="'经手人'"
+                                              :readonly="onlyread" 
+                                              dense outlined 
+                                            />
+                                          </div>
+                                          <div class="col">
+                                      <q-input 
+                                        v-model="item.memo" 
+                                        label="备注"
+                                        :readonly="onlyread" 
+                                        dense outlined
+                                        type="textarea"
+        
+                                        :input-style="{ 
+                                          whiteSpace: 'pre-wrap',
+                                          overflowY: 'auto',
+                                          minHeight: '40px' 
+                                        }"
+                                        style="min-width: 100px; max-width: 600px"
+                                      />
+                                    </div>
 
-                              </div>
+                                      </div>
+                                    </q-card-section>
+                                  </q-card>
+                                </q-expansion-item>
+                              </q-list>
                             </template>
-
+                            <div v-else class="text-grey-8">
+                              暂无操作记录
+                            </div>
                           </template>
+
                         </q-card-section>
                       </q-card>
                   </div>  
@@ -286,8 +327,72 @@
   </template>
 
   
-  <script>
+<script>
+class ListNode {
+  constructor(value) {
+    this.value = value
+    this.next = null
+  }
+}
+
+class LinkedList {
+  constructor() {
+    this.head = null
+    this.size = 0
+  }
+
+  append(value) {
+    const newNode = new ListNode(value)
+    if (!this.head) {
+      this.head = newNode
+    } else {
+      let current = this.head
+      while (current.next) {
+        current = current.next
+      }
+      current.next = newNode
+    }
+    this.size++
+  }
+
+  delete(value) {
+    if (!this.head) return
+
+    if (this.head.value === value) {
+      this.head = this.head.next
+      this.size--
+      return
+    }
+
+    let current = this.head
+    while (current.next) {
+      if (current.next.value === value) {
+        current.next = current.next.next
+        this.size--
+        return
+      }
+      current = current.next
+    }
+  }
+
+  toArray() {
+    const result = []
+    let current = this.head
+    while (current) {
+      result.push({ value: current.value })
+      current = current.next
+    }
+    return result
+  }
+
+  clear() {
+    this.head = null
+    this.size = 0
+  }
+}
+
   import { getauth, postauth, putauth, deleteauth } from 'boot/axios_request'
+  import { _ } from 'core-js'
   import { date, exportFile, LocalStorage } from 'quasar'
   
   
@@ -342,12 +447,15 @@
           }
         ],
         operate_detail: [],
+        linkedList: new LinkedList(),
+        newValue: '',
+
         error1: this.$t('goods.view_goodslist.error1'),
         current: 1,
         max: 0,
         total: 0,
         paginationIpt: 1,
-        onlyread: false,
+        onlyread: true,
       }
 
     },
@@ -474,10 +582,63 @@
               color: 'negative'
             })
           })
-      console.log("detail查询的结果是:",_this.table_detail)      
-    },
-    
-  
+    _this.getOperationRecord(e)      
+      },
+      getOperationRecord(row) {
+        var _this = this
+        _this.operate_detail = []
+        var operate_detail_container = []
+        _this.linkedList.clear()
+        getauth('container/operate/?container=' + row.id)
+          .then(res => {
+            _this.operate_detail = res.results
+            
+            operate_detail_container.push(_this.operate_detail[0])
+            for (let i = 0; i < _this.operate_detail.length; i++) {
+            if (_this.operate_detail[i].operation_type == _this.operate_detail[i+1].operation_type) {
+              operate_detail_container.push(_this.operate_detail[i+1])
+            }
+            else {
+              _this.linkedList.append(operate_detail_container)
+              operate_detail_container = []
+              operate_detail_container.push(_this.operate_detail[i+1])
+            }
+            _this.linkedList.append(operate_detail_container)
+            operate_detail_container = []
+
+          }
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+      },
+      formatType(type) {
+        switch (type) {
+          case 'container':
+            return '组盘'
+          case '2':
+            return '出库'
+          case '3':
+            return '盘点'
+          case '4':
+            return '移库'
+          case '5':
+            return '调拨'
+          case '6':
+            return '其他'
+          default:
+            return '未知'
+        }
+      },
+      sortoperatedetail() {
+      var _this = this
+      console.log("近一个月操作记录",_this.nodeList)
+
+      }
     },
     created() {
       var _this = this
@@ -512,11 +673,18 @@
     },
     updated() { },
     destroyed() { },
-    // 在 watch 或方法中添加调试代码
-    watch: {
+    computed: {
+      nodeList() {
+      return this.linkedList.toArray()
+    },
 
+    listSize() {
+      return this.linkedList.size
     }
   }
+
+
+  }
   </script>
   <style scoped>
   /* 添加在 <style> 中 */