فهرست منبع

编写入库task

flower_mr 2 ماه پیش
والد
کامیت
cd1a0a41b3

BIN
bound/__pycache__/filter.cpython-38.pyc


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


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


+ 3 - 2
bound/filter.py

@@ -91,8 +91,9 @@ class BoundBatchFilter(FilterSet):
             'warehouse_code': ['icontains', 'exact'],
             'warehouse_name': ['icontains','exact'],
             
-            'goods_code': ['icontains', 'exact'],
-            'goods_desc': ['icontains', 'exact'],
+                'goods_code': ['icontains', 'exact'],
+                'goods_desc': ['icontains', 'exact'],
+            'goods_std': ['icontains', 'exact'],
             'goods_qty': ['exact', 'gt', 'gte', 'lt', 'lte', 'icontains','range'],
             'goods_in_qty': ['exact', 'gt', 'gte', 'lt', 'lte', 'icontains','range'],
             'goods_out_qty': ['exact', 'gt', 'gte', 'lt', 'lte', 'icontains','range'],

+ 18 - 0
bound/migrations/0003_boundbatchmodel_goods_std.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.1.2 on 2025-04-08 10:31
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('bound', '0002_bounddetailmodel_status'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='boundbatchmodel',
+            name='goods_std',
+            field=models.CharField(default='待填写', max_length=255, verbose_name='商品标准'),
+        ),
+    ]

BIN
bound/migrations/__pycache__/0003_boundbatchmodel_goods_std.cpython-38.pyc


+ 2 - 3
bound/models.py

@@ -27,8 +27,6 @@ class BoundListModel(models.Model):
         verbose_name_plural = "Bound List"
         ordering = ['-id']
 
-
-
 class BoundBatchModel(models.Model):
 
     CONTAINER_STATUS = (
@@ -46,6 +44,7 @@ class BoundBatchModel(models.Model):
     warehouse_name = models.CharField(max_length=255, verbose_name="仓库名称")
     goods_code = models.CharField(max_length=255, verbose_name="商品编码")
     goods_desc = models.CharField(max_length=255, verbose_name="商品描述")
+    goods_std = models.CharField(default='待填写', max_length=255, verbose_name="商品标准")
     goods_qty = models.BigIntegerField(default=0, verbose_name="商品数量")
     goods_in_qty = models.BigIntegerField(default=0, verbose_name="入库数量")
     goods_out_qty = models.BigIntegerField(default=0, verbose_name="出库数量")
@@ -66,8 +65,8 @@ class BoundBatchModel(models.Model):
         verbose_name = 'Bound Batch'
         verbose_name_plural = "Bound Batch"
         ordering = ['-id']
-        
 
+# 利用创建好的批次来与申请单相对应       
 class BoundDetailModel(models.Model):
     CONTAINER_STATUS = (
         (0, '入库申请'),

+ 2 - 0
bound/serializers.py

@@ -59,6 +59,7 @@ class BoundBatchGetSerializer(serializers.ModelSerializer):
     warehouse_name = serializers.CharField(read_only=True, required=False)
     goods_code = serializers.CharField(read_only=True, required=False)
     goods_desc = serializers.CharField(read_only=True, required=False)
+    goods_std =  serializers.CharField(read_only=True, required=False)
     goods_qty = serializers.IntegerField(read_only=True, required=False)
     goods_in_qty = serializers.IntegerField(read_only=True, required=False)
     goods_out_qty = serializers.IntegerField(read_only=True, required=False)
@@ -85,6 +86,7 @@ class BoundBatchPostSerializer(serializers.ModelSerializer):
     warehouse_name = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
     goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
     goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
+    goods_std =  serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
     goods_qty = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
     goods_in_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
     goods_out_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])

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


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


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


+ 8 - 1
container/models.py

@@ -1,5 +1,6 @@
 from django.db import models
 from bound.models import BoundBatchModel
+from bound.models import BoundDetailModel
 # Create your models here.
 # 主表:托盘数据
 class ContainerListModel(models.Model):
@@ -111,4 +112,10 @@ class ContainerWCSModel(models.Model):
             'message': self.message,
             'container': self.container,
             'status': self.status
-        }
+        }
+
+# class TaskModel(models.Model):
+    
+#     task_wcs = models.ForeignKey(ContainerWCSModel, on_delete=models.CASCADE, related_name='tasks')
+#     batch = models.ForeignKey(BoundBatchModel, on_delete=models.CASCADE, verbose_name='批次')
+#     bound_detail = models.ForeignKey(BoundDetailModel, on_delete=models.CASCADE, verbose_name='绑定明细')

+ 7 - 0
container/urls.py

@@ -23,6 +23,13 @@ re_path(r'^operate/(?P<pk>\d+)/$', views.ContainerOperateViewSet.as_view({
     'patch': 'partial_update',
 }), name="ContainerDetail_1"),
 
+path(r'task/', views.TaskViewSet.as_view({"get": "list", "post": "create"}), name="Task"),
+re_path(r'^task/(?P<pk>\d+)/$', views.TaskViewSet.as_view({
+    'get': 'retrieve',
+    'put': 'update',
+    'patch': 'partial_update',
+}), name="Task_1"),
+
 path(r'container_wcs/', views.ContainerWCSViewSet.as_view({"get": "get_container_wcs"}), name='ContainerWCS'),
 
 ]

+ 84 - 8
container/views.py

@@ -92,6 +92,72 @@ class ContainerListViewSet(viewsets.ModelViewSet):
         headers = self.get_success_headers(serializer.data)
         return Response(serializer.data, status=200, headers=headers)
 
+class TaskViewSet(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)
+
+    """
+    pagination_class = MyPageNumberPagination   
+    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
+    ordering_fields = ['id', "create_time", "update_time", ]
+    filter_class = ContainerListFilter
+
+    def get_project(self):
+        try:
+            id = self.kwargs.get('pk')
+            return id
+        except:
+            return None
+
+    def get_queryset(self):
+        id = self.get_project()
+        if self.request.user:
+            if id is None:
+                return ContainerListModel.objects.filter()
+            else:
+                return ContainerListModel.objects.filter( id=id)
+        else:
+            return ContainerListModel.objects.none()
+
+
+    def get_serializer_class(self):
+        if self.action in ['list', 'destroy','retrieve']:
+            return ContainerListGetSerializer
+        elif self.action in ['create', 'update']:
+            return ContainerListPostSerializer
+        else:
+            return self.http_method_not_allowed(request=self.request)
+
+    def create(self, request, *args, **kwargs):
+        data = self.request.data
+        order_month = str(timezone.now().strftime('%Y%m'))
+        data['month'] = order_month
+        data['last_operate'] = str(timezone.now())
+        
+        serializer = self.get_serializer(data=data)
+        serializer.is_valid(raise_exception=True)
+        serializer.save()
+
+        headers = self.get_success_headers(serializer.data)
+        return Response(serializer.data, status=200, headers=headers)
+    
+    def update(self, request, pk):
+        qs = self.get_object()
+        data = self.request.data
+        serializer = self.get_serializer(qs, data=data)
+        serializer.is_valid(raise_exception=True)
+        serializer.save()
+        headers = self.get_success_headers(serializer.data)
+        return Response(serializer.data, status=200, headers=headers)
+
 class ContainerWCSViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -108,21 +174,29 @@ class ContainerWCSViewSet(viewsets.ModelViewSet):
     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 = {}
+        data_return={}
         if container_obj:
-            print('托盘编码存在', container_obj.id)
-            data['container'] = container
-            print('托盘编码存储', data['container'])
-            if container_obj.current_location == container_obj.target_location:
+            data['container_code'] = container
+            serializer = ContainerListPostSerializer(container_obj, data=data)
+            serializer.is_valid(raise_exception=True)
+            serializer.save()
+
+            if current_location == container_obj.target_location:
+                print('当前位置已是目标位置')
                 data['message'] = '当前位置已是目标位置'
+                data_return={
+                    'code':'200',
+                    'message':data['message'],
+                    'data':data
+                }
             else:
+                print('当前位置不是目标位置')
                 current_task = ContainerWCSModel.objects.filter(container=container, tasktype='inbound').first()
                 if current_task:
                     data['message'] = '当前任务已存在,再次下发'
@@ -132,6 +206,7 @@ class ContainerWCSViewSet(viewsets.ModelViewSet):
                         'data':current_task.to_dict()
                     }
                 else:
+                    print('生成入库任务')
                     data_tosave['container'] = container
                     data_tosave['current_location'] = current_location
                     data_tosave['month'] = str(timezone.now().strftime('%Y%m'))
@@ -145,14 +220,14 @@ class ContainerWCSViewSet(viewsets.ModelViewSet):
                     data_tosave['message'] = '生成入库任务'
                     data_tosave['container'] = container
                     data_tosave['status'] = 103
+                    data_tosave['is_delete'] = False
                     data_return={
                         'code':'200',
                         'message':data_tosave['message'],
                         'data':data_tosave
                     }
                     ContainerWCSModel.objects.create(**data_tosave)
-                    print('入库任务创建成功', data_tosave['taskid'])
-           
+                    print('入库任务创建成功', data_tosave['taskid']) 
         else:
             print('托盘编码不存在')
             data_return={
@@ -160,6 +235,7 @@ class ContainerWCSViewSet(viewsets.ModelViewSet):
                 'message':'托盘编码不存在',
                 'data':data
             }
+        
         return Response(data_return)
 
 class ContainerDetailViewSet(viewsets.ModelViewSet):

BIN
db.sqlite3


+ 62 - 0
logs/error.log

@@ -1961,3 +1961,65 @@ Traceback (most recent call last):
   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-07 16:47:44,827][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 163, in get_container_wcs
+    return Response(data_return)
+UnboundLocalError: local variable 'data_return' referenced before assignment
+[2025-04-07 16:48:15,096][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 163, in get_container_wcs
+    return Response(data_return)
+UnboundLocalError: local variable 'data_return' referenced before assignment

+ 107 - 0
logs/server.log

@@ -2029,3 +2029,110 @@ AttributeError: 'ContainerOperationModel' object has no attribute 'container_lis
 [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/
+[2025-04-07 13:55:40,138][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-07 13:56:06,277][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 13:56:14,009][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 13:56:18,729][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 13:56:33,476][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 13:56:35,147][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-07 13:56:37,378][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-07 13:56:57,121][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-07 13:57:10,161][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-07 14:01:14,549][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 14:01:18,567][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 15:43:15,552][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-07 15:43:16,557][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-07 16:03:23,239][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 16:14:37,136][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 16:14:57,005][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-07 16:18:22,918][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 16:19:07,626][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 16:20:29,618][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 16:23:36,860][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 16:23:45,168][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-07 16:25:57,823][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-07 16:26:07,117][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-07 16:26:16,321][django.request.log_response():241] [WARNING] Not Found: /asn/list/
+[2025-04-07 16:26:24,398][django.request.log_response():241] [WARNING] Not Found: /asn/list/
+[2025-04-07 16:26:33,192][django.request.log_response():241] [WARNING] Not Found: /stock/list/
+[2025-04-07 16:26:35,621][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-07 16:26:49,128][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 16:26:51,603][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 16:26:54,291][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 16:34:24,148][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 16:47:44,827][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 163, in get_container_wcs
+    return Response(data_return)
+UnboundLocalError: local variable 'data_return' referenced before assignment
+[2025-04-07 16:48:15,096][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 163, in get_container_wcs
+    return Response(data_return)
+UnboundLocalError: local variable 'data_return' referenced before assignment
+[2025-04-07 17:04:11,721][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 17:04:18,896][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-07 17:11:13,303][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-07 17:11:18,881][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 17:13:07,677][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-07 17:27:39,839][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-07 17:37:33,420][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-07 17:37:45,515][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-07 17:45:54,526][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-07 17:45:56,404][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-07 17:46:10,892][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-07 17:46:21,331][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-08 10:35:46,701][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-08 10:35:51,969][django.request.log_response():241] [WARNING] Not Found: /asn/detail/

+ 3 - 3
templates/src/i18n/zh-hans/index.js

@@ -64,8 +64,8 @@ export default {
   },
   menuItem: {
     dashboard: '报表中心',
-    inbound: '收货管理',
-    outbound: '发货管理',
+    inbound: '入库管理',
+    outbound: '出库管理',
     stock: '库存管理',
     finance: '操作记录',
     goods: '商品管理',
@@ -384,7 +384,7 @@ export default {
     }
   },
   inbound: {
-    asn: '到货通知书',
+    asn: '入库申请书',
     predeliverystock: '待到货',
     preloadstock: '待卸货',
     presortstock: '待分拣',

+ 11 - 10
templates/src/pages/container/container.vue

@@ -9,7 +9,7 @@
                 <q-route-tab
                   name="containerlist"
                   :label="'托盘列表'"
-                  icon="img:statics/dashboard/out_statement.png"
+                  icon=layers
                   :to="{ name: 'containerlist' }"
                   exact
                 />
@@ -17,24 +17,25 @@
               </transition>
               <transition appear enter-active-class="animated zoomIn">
                 <q-route-tab
-                  name="containeroperate"
-                  :label="'入库出库'"
-                  icon="img:statics/dashboard/out_statement.png"
-                  :to="{ name: 'containeroperate' }"
+                  name="containerdetail"
+                  :label="'托盘统计'"
+                  icon=table_view
+                  :to="{ name: 'containerdetail' }"
                   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' }"
+                  name="containeroperate"
+                  :label="'入库出库'"
+                  icon=warehouse
+                  :to="{ name: 'containeroperate' }"
                   exact
                 />
+         
               </transition>
 
+
   
               
             </q-tabs>

+ 40 - 632
templates/src/pages/container/containerdetail.vue

@@ -7,16 +7,12 @@
           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 />
@@ -53,235 +49,44 @@
             <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">
+ 
+              <template >
                 <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">
+
+              <template >
                 <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 >
+                <q-td key="goods_batch" :props="props">{{ props.row.batch.bound_number }}</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 >
+                <q-td key="container_code" :props="props">{{ props.row.container.container_code }}</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 >
+                <q-td key="current_location" :props="props">{{ props.row.container.current_location }}</q-td>
+              </template>              
+              
+              <template>
+                <q-td key="goods_qty" :props="props">{{ props.row.goods_qty }}</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 >
+                <q-td key="creater" :props="props">{{ props.row.creater }}</q-td>
               </template>
-              <template v-else-if="props.row.id !== editid">
-                <q-td key="creator" :props="props">{{ props.row.creator }}</q-td>
+              <template >
+                <q-td key="create_time" :props="props">{{ props.row.create_time }}</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>
@@ -300,112 +105,7 @@
           <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 />
@@ -430,92 +130,33 @@
         login_name: '',
         authin: '0',
         searchUrl: '',
-        pathname: 'reportcenter/flow/',
-        pathfilename: 'reportcenter/file/',
-  
+        pathname: 'container/detail/',
+
         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_desc', label: '存货名称', field: 'goods_desc', 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' }
+          { name: 'container_code', label: '所处托盘', field: 'container_code', align: 'center' },
+          { name: 'current_location', label: '当前位置', field: 'current_location', align: 'center' },
+          { name: 'goods_qty', label: '扫描数目', field: 'goods_qty', align: 'center' },
+          { name: 'creater', label: '组盘人', field: 'creator', align: 'center' },
+          { name: 'create_time', label: '创建时间', field: 'create_time', 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,
@@ -591,56 +232,10 @@
         this.paginationIpt = page
         this.getList({
           goods_desc__icontains: this.filter,
-          document_date__range: this.date_range
+          create_time__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')) {
@@ -683,194 +278,7 @@
         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

+ 20 - 16
templates/src/pages/container/containerlist.vue

@@ -180,7 +180,7 @@
                                   </div>
                                   <div class="col">
                                     <q-input 
-                                      v-model="item.batch.goods_qty" 
+                                      v-model="item.goods_qty" 
                                       :label="'数量'"
                                       :readonly="onlyread" 
                                       dense outlined 
@@ -229,10 +229,7 @@
                                   v-for="(node, index) in nodeList"
                                   :key="index"
                                   group="op-group"
-                                  :caption="`操作类型: ${formatType(node.value[0].operation_type)} ----- 操作时间:${node.value[0].timestamp }`"  
-                         
-                          
-                                      
+                                  :caption="`操作类型: ${formatType(node.value[0].operation_type)} ----- 操作时间:${node.value[0].timestamp }`"         
                                 >
                                   <!-- 展开后的详细信息 -->
                                   <q-card>
@@ -271,7 +268,7 @@
                                           </div>
                                           <div class="col">
                                             <q-input 
-                                              v-model="item.batch.goods_qty" 
+                                              v-model="item.goods_qty" 
                                               :label="'数量'"
                                               :readonly="onlyread" 
                                               dense outlined 
@@ -589,23 +586,30 @@ class LinkedList {
         _this.operate_detail = []
         var operate_detail_container = []
         _this.linkedList.clear()
-        getauth('container/operate/?container=' + row.id)
+        getauth('container/operate/?status=1&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])
+            if (_this.operate_detail.length == 0) {
+              _this.linkedList.clear()
+              return
             }
-            else {
-              _this.linkedList.append(operate_detail_container)
-              operate_detail_container = []
-              operate_detail_container.push(_this.operate_detail[i+1])
+            if (_this.operate_detail.length == 1) {
+              _this.linkedList.append(_this.operate_detail)
+              return
             }
+            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 => {

+ 4 - 2
templates/src/pages/inbound/asn.vue

@@ -152,7 +152,7 @@
 
             <template v-if="!editMode">
               <q-td key="action" :props="props" style="width: 100px">
-                <q-btn round flat push color="purple" icon="edit" @click="detail(props.row)">
+                <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>
@@ -299,7 +299,9 @@
 
 
          
-          <q-input dense outlined square v-model="newBatchFormData.goods_desc" :label="'名称/备注'" 
+          <q-input dense outlined square v-model="newBatchFormData.goods_desc" :label="'名称'" 
+            :rules="[val => (val && val.length > 0) || error1]" />
+          <q-input dense outlined square v-model="newBatchFormData.goods_std" :label="'规格/备注'" 
             :rules="[val => (val && val.length > 0) || error1]" />
           <q-input dense outlined square v-model.number="newBatchFormData.goods_weight" :label="'单重'" type="number"
             :rules="[val => (val && val > 0) || error1]" />