Browse Source

开始编写库位管理

flower_mr 3 months ago
parent
commit
571f56a0d3
60 changed files with 892 additions and 2049 deletions
  1. 0 0
      asn/__init__.py
  2. BIN
      asn/__pycache__/__init__.cpython-310.pyc
  3. BIN
      asn/__pycache__/__init__.cpython-38.pyc
  4. BIN
      asn/__pycache__/admin.cpython-310.pyc
  5. BIN
      asn/__pycache__/admin.cpython-38.pyc
  6. BIN
      asn/__pycache__/apps.cpython-310.pyc
  7. BIN
      asn/__pycache__/apps.cpython-38.pyc
  8. BIN
      asn/__pycache__/files.cpython-310.pyc
  9. BIN
      asn/__pycache__/files.cpython-38.pyc
  10. BIN
      asn/__pycache__/filter.cpython-310.pyc
  11. BIN
      asn/__pycache__/filter.cpython-38.pyc
  12. BIN
      asn/__pycache__/models.cpython-310.pyc
  13. BIN
      asn/__pycache__/models.cpython-38.pyc
  14. BIN
      asn/__pycache__/page.cpython-310.pyc
  15. BIN
      asn/__pycache__/serializers.cpython-310.pyc
  16. BIN
      asn/__pycache__/serializers.cpython-38.pyc
  17. BIN
      asn/__pycache__/urls.cpython-310.pyc
  18. BIN
      asn/__pycache__/urls.cpython-38.pyc
  19. BIN
      asn/__pycache__/views.cpython-310.pyc
  20. BIN
      asn/__pycache__/views.cpython-38.pyc
  21. 0 5
      asn/admin.py
  22. 0 5
      asn/apps.py
  23. 0 73
      asn/files.py
  24. 0 84
      asn/filter.py
  25. 0 67
      asn/migrations/0001_initial.py
  26. 0 0
      asn/migrations/__init__.py
  27. BIN
      asn/migrations/__pycache__/0001_initial.cpython-310.pyc
  28. BIN
      asn/migrations/__pycache__/0001_initial.cpython-38.pyc
  29. BIN
      asn/migrations/__pycache__/__init__.cpython-310.pyc
  30. BIN
      asn/migrations/__pycache__/__init__.cpython-38.pyc
  31. 0 57
      asn/models.py
  32. 0 88
      asn/serializers.py
  33. 0 0
      asn/tests.py
  34. 0 18
      asn/urls.py
  35. 0 219
      asn/views.py
  36. 3 1
      bound/migrations/0001_initial.py
  37. 0 18
      bound/migrations/0002_bounddetailmodel_status.py
  38. 0 18
      bound/migrations/0003_boundbatchmodel_goods_std.py
  39. BIN
      bound/migrations/__pycache__/0001_initial.cpython-38.pyc
  40. BIN
      bound/migrations/__pycache__/__init__.cpython-38.pyc
  41. BIN
      container/__pycache__/filter.cpython-38.pyc
  42. BIN
      container/__pycache__/models.cpython-38.pyc
  43. BIN
      container/__pycache__/serializers.cpython-38.pyc
  44. BIN
      container/__pycache__/views.cpython-38.pyc
  45. 3 0
      container/filter.py
  46. 3 3
      container/migrations/0001_initial.py
  47. 0 20
      container/migrations/0002_alter_taskmodel_bound_detail.py
  48. 0 20
      container/migrations/0003_alter_taskmodel_bound_detail.py
  49. 0 17
      container/migrations/0004_remove_taskmodel_bound_detail.py
  50. BIN
      container/migrations/__pycache__/0001_initial.cpython-38.pyc
  51. BIN
      container/migrations/__pycache__/__init__.cpython-38.pyc
  52. 3 1
      container/models.py
  53. 5 0
      container/serializers.py
  54. 2 2
      container/views.py
  55. BIN
      db.sqlite3
  56. 28 0
      logs/server.log
  57. 0 7
      templates/src/layouts/MainLayout.vue
  58. 398 0
      templates/src/pages/container/containeroperate copy.vue
  59. 343 900
      templates/src/pages/container/containeroperate.vue
  60. 104 426
      templates/src/pages/inbound/sortstock.vue

+ 0 - 0
asn/__init__.py


BIN
asn/__pycache__/__init__.cpython-310.pyc


BIN
asn/__pycache__/__init__.cpython-38.pyc


BIN
asn/__pycache__/admin.cpython-310.pyc


BIN
asn/__pycache__/admin.cpython-38.pyc


BIN
asn/__pycache__/apps.cpython-310.pyc


BIN
asn/__pycache__/apps.cpython-38.pyc


BIN
asn/__pycache__/files.cpython-310.pyc


BIN
asn/__pycache__/files.cpython-38.pyc


BIN
asn/__pycache__/filter.cpython-310.pyc


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


BIN
asn/__pycache__/models.cpython-310.pyc


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


BIN
asn/__pycache__/page.cpython-310.pyc


BIN
asn/__pycache__/serializers.cpython-310.pyc


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


BIN
asn/__pycache__/urls.cpython-310.pyc


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


BIN
asn/__pycache__/views.cpython-310.pyc


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


+ 0 - 5
asn/admin.py

@@ -1,5 +0,0 @@
-from django.contrib import admin
-from .models import AsnListModel, AsnDetailModel
-
-admin.site.register(AsnListModel)
-admin.site.register(AsnDetailModel)

+ 0 - 5
asn/apps.py

@@ -1,5 +0,0 @@
-from django.apps import AppConfig
-
-
-class AsnConfig(AppConfig):
-    name = 'asn'

+ 0 - 73
asn/files.py

@@ -1,73 +0,0 @@
-from rest_framework_csv.renderers import CSVStreamingRenderer
-
-def list_file_headers():
-    return [
-
-    ]
-
-def list_cn_data_header():
-    return dict([
-        ('asn_code', u'ASN单号'),
-        ('asn_status', u'ASN状态'),
-        ('total_weight', u'总重量'),
-        ('total_volume', u'总体积'),
-        ('total_cost', u'总成本'),
-        ('supplier', u'供应商'),
-        ('creater', u'创建人'),
-        ('create_time', u'创建时间'),
-        ('update_time', u'更新时间')
-    ])
-
-
-def detail_file_headers():
-    return [
-        'asn_code',
-        'asn_status',
-        'supplier',
-        'goods_code',
-        'goods_desc',
-        'goods_qty',
-        'goods_actual_qty',
-        'sorted_qty',
-        'goods_shortage_qty',
-        'goods_more_qty',
-        'goods_damage_qty',
-        'goods_weight',
-        'goods_volume',
-        'goods_cost',
-        'creater',
-        'create_time',
-        'update_time'
-    ]
-
-def detail_cn_data_header():
-    return dict([
-        ('asn_code', u'ASN单号'),
-        ('asn_status', u'ASN状态'),
-        ('supplier', u'供应商'),
-        ('goods_code', u'商品编码'),
-        ('goods_desc', u'商品描述'),
-        ('goods_qty', u'订单数量'),
-        ('goods_actual_qty', u'实际到货数量'),
-        ('sorted_qty', u'已分拣数量'),
-        ('goods_shortage_qty', u'少到货数量'),
-        ('goods_more_qty', u'多到货数量'),
-        ('goods_damage_qty', u'破损数量'),
-        ('goods_weight', u'商品重量'),
-        ('goods_volume', u'商品体积'),
-        ('goods_cost', u'商品成本'),
-        ('creater', u'创建人'),
-        ('create_time', u'创建时间'),
-        ('update_time', u'更新时间')
-    ])
-
-class FileListRenderCN(CSVStreamingRenderer):
-    header = list_file_headers()
-    labels = list_cn_data_header()
-
-
-class FileDetailRenderCN(CSVStreamingRenderer):
-    header = detail_file_headers()
-    labels = detail_cn_data_header()
-
-

+ 0 - 84
asn/filter.py

@@ -1,84 +0,0 @@
-from django_filters import FilterSet
-from .models import AsnListModel, AsnDetailModel
-
-
-class AsnListFilter(FilterSet):
-
-    class Meta:
-        model = AsnListModel
-        fields = {
-            "id": ['exact', 'gt', 'gte', 'lt', 'lte', 'isnull', 'in', 'range'],
-            'code': ['icontains', 'exact'],
-            'asn_code': ['icontains', 'exact'],
-            'asn_status': ['exact'],
-            'asn_type': ['exact'],
-
-            'goods_code': ['icontains', 'exact'],
-            'goods_desc': ['icontains'],
-            'goods_qty': ['exact', 'gt', 'lt', 'gte', 'lte'],
-            'goods_weight': ['exact', 'gt', 'lt', 'gte', 'lte'],
-
-    
-            'creater': ['icontains', 'exact'],
-            'openid': ['exact'],
-            'is_delete': ['exact'],
-            'create_time': ['exact', 'gt', 'gte', 'lt', 'lte',
-             'year', 'year__gt', 'year__gte', 'year__lt', 'year__lte', 'year__range', 'year__in', 
-             'month','month__gt','month__gte','month__lt','month__lte','month__range','month__in', 
-             'day', 'day__gt', 'day__gte', 'day__lt', 'day__lte', 'day__range', 'day__in',
-              'week_day', 'week_day__gt', 'week_day__gte', 'week_day__lt', 'week_day__lte', 'week_day__range', 'week_day__in', 
-              'hour', 'hour__gt', 'hour__gte', 'hour__lt', 'hour__lte', 'hour__range', 'hour__in',
-
-              'date', 'date__gt', 'date__gte', 'date__lt', 'date__lte', 'date__range', 'date__in', 
-              'time', 'time__gt', 'time__gte', 'time__lt', 'time__lte', 'time__range', 'time__in', 'isnull', 'in', 'range'],
-            'update_time':
-             ['exact', 'gt', 'gte', 'lt', 'lte',
-             'year', 'year__gt', 'year__gte', 'year__lt', 'year__lte', 'year__range', 'year__in', 
-             'month','month__gt','month__gte','month__lt','month__lte','month__range','month__in', 
-             'day', 'day__gt', 'day__gte', 'day__lt', 'day__lte', 'day__range', 'day__in',
-              'week_day', 'week_day__gt', 'week_day__gte', 'week_day__lt', 'week_day__lte', 'week_day__range', 'week_day__in', 
-              'hour', 'hour__gt', 'hour__gte', 'hour__lt', 'hour__lte', 'hour__range', 'hour__in',
-
-              'date', 'date__gt', 'date__gte', 'date__lt', 'date__lte', 'date__range', 'date__in', 
-              'time', 'time__gt', 'time__gte', 'time__lt', 'time__lte', 'time__range', 'time__in', 'isnull', 'in', 'range'],
-            
-        }
-class AsnDetailFilter(FilterSet):
-    class Meta:
-        model = AsnDetailModel
-        fields = {
-            "id": ['exact', 'gt', 'gte', 'lt', 'lte', 'isnull', 'in', 'range'],
-            'asn_code': ['icontains', 'exact'],
-            'asn_status': ['exact'],
-            'asn_type': ['exact'],
-            'goods_code': ['icontains', 'exact'],
-            'goods_desc': ['icontains'],
-            'goods_qty': ['exact', 'gt', 'lt', 'gte', 'lte'],
-            'goods_weight': ['exact', 'gt', 'lt', 'gte', 'lte'],
-            'warehouse_code': ['icontains', 'exact'],
-            'warehouse_name': ['icontains'],
-            'shelf_name': ['icontains'],
-            'container_code': ['icontains', 'exact'],
-            'creater': ['icontains', 'exact'],
-            'openid': ['exact'],
-            'is_delete': ['exact'],
-            'create_time':  ['exact', 'gt', 'gte', 'lt', 'lte',
-             'year', 'year__gt', 'year__gte', 'year__lt', 'year__lte', 'year__range', 'year__in', 
-             'month','month__gt','month__gte','month__lt','month__lte','month__range','month__in', 
-             'day', 'day__gt', 'day__gte', 'day__lt', 'day__lte', 'day__range', 'day__in',
-              'week_day', 'week_day__gt', 'week_day__gte', 'week_day__lt', 'week_day__lte', 'week_day__range', 'week_day__in', 
-              'hour', 'hour__gt', 'hour__gte', 'hour__lt', 'hour__lte', 'hour__range', 'hour__in',
-
-              'date', 'date__gt', 'date__gte', 'date__lt', 'date__lte', 'date__range', 'date__in', 
-              'time', 'time__gt', 'time__gte', 'time__lt', 'time__lte', 'time__range', 'time__in', 'isnull', 'in', 'range'],
-              
-            'update_time': ['exact', 'gt', 'gte', 'lt', 'lte',
-             'year', 'year__gt', 'year__gte', 'year__lt', 'year__lte', 'year__range', 'year__in', 
-             'month','month__gt','month__gte','month__lt','month__lte','month__range','month__in', 
-             'day', 'day__gt', 'day__gte', 'day__lt', 'day__lte', 'day__range', 'day__in',
-              'week_day', 'week_day__gt', 'week_day__gte', 'week_day__lt', 'week_day__lte', 'week_day__range', 'week_day__in', 
-              'hour', 'hour__gt', 'hour__gte', 'hour__lt', 'hour__lte', 'hour__range', 'hour__in',
-
-              'date', 'date__gt', 'date__gte', 'date__lt', 'date__lte', 'date__range', 'date__in', 
-              'time', 'time__gt', 'time__gte', 'time__lt', 'time__lte', 'time__range', 'time__in', 'isnull', 'in', 'range'],
-        }

+ 0 - 67
asn/migrations/0001_initial.py

@@ -1,67 +0,0 @@
-# Generated by Django 4.1.2 on 2025-03-18 14:33
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    initial = True
-
-    dependencies = [
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='AsnDetailModel',
-            fields=[
-                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('asn_code', models.CharField(max_length=255, verbose_name='ASN Code')),
-                ('asn_status', models.CharField(max_length=255, verbose_name='ASN Status')),
-                ('asn_type', models.CharField(max_length=255, verbose_name='ASN Type')),
-                ('goods_code', models.CharField(max_length=255, verbose_name='Goods Code')),
-                ('goods_desc', models.CharField(max_length=255, verbose_name='Goods Description')),
-                ('goods_qty', models.BigIntegerField(default=0, verbose_name='Goods QTY')),
-                ('goods_weight', models.FloatField(default=0, verbose_name='Goods Weight')),
-                ('warehouse_code', models.CharField(default='empty_code', max_length=255, verbose_name='Warehouse Code')),
-                ('warehouse_name', models.CharField(default='empty_name', max_length=255, verbose_name='Warehouse Name')),
-                ('shelf_name', models.CharField(default='empty_name', max_length=255, verbose_name='Shelf Name')),
-                ('container_code', models.CharField(default='empty_code', max_length=255, verbose_name='Container Code')),
-                ('creater', models.CharField(default='uesr', max_length=255, verbose_name='Who Created')),
-                ('openid', models.CharField(max_length=255, verbose_name='Openid')),
-                ('is_delete', models.BooleanField(default=False, verbose_name='Delete Label')),
-                ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='Create Time')),
-                ('update_time', models.DateTimeField(auto_now=True, null=True, verbose_name='Update Time')),
-            ],
-            options={
-                'verbose_name': 'ASN Detail',
-                'verbose_name_plural': 'ASN Detail',
-                'db_table': 'asndetail',
-                'ordering': ['-id'],
-            },
-        ),
-        migrations.CreateModel(
-            name='AsnListModel',
-            fields=[
-                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('code', models.CharField(max_length=255, verbose_name='Code')),
-                ('asn_code', models.CharField(max_length=255, verbose_name='ASN Code')),
-                ('asn_status', models.CharField(max_length=255, verbose_name='ASN Status')),
-                ('asn_type', models.CharField(max_length=255, verbose_name='ASN Type')),
-                ('goods_code', models.CharField(max_length=255, verbose_name='Goods Code')),
-                ('goods_desc', models.CharField(max_length=255, verbose_name='Goods Description')),
-                ('goods_qty', models.BigIntegerField(default=0, verbose_name='Goods QTY')),
-                ('goods_weight', models.FloatField(default=0, verbose_name='Goods Weight')),
-                ('creater', models.CharField(default='uesr', max_length=255, verbose_name='Who Created')),
-                ('openid', models.CharField(max_length=255, verbose_name='Openid')),
-                ('is_delete', models.BooleanField(default=False, verbose_name='Delete Label')),
-                ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='Create Time')),
-                ('update_time', models.DateTimeField(auto_now=True, null=True, verbose_name='Update Time')),
-            ],
-            options={
-                'verbose_name': 'ASN List',
-                'verbose_name_plural': 'ASN List',
-                'db_table': 'asnlist',
-                'ordering': ['-id'],
-            },
-        ),
-    ]

+ 0 - 0
asn/migrations/__init__.py


BIN
asn/migrations/__pycache__/0001_initial.cpython-310.pyc


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


BIN
asn/migrations/__pycache__/__init__.cpython-310.pyc


BIN
asn/migrations/__pycache__/__init__.cpython-38.pyc


+ 0 - 57
asn/models.py

@@ -1,57 +0,0 @@
-from django.db import models
-
-
-
-class AsnListModel(models.Model):
-    code = models.CharField(max_length=255, verbose_name="Code")
-    asn_code = models.CharField(max_length=255, verbose_name="ASN Code")
-    asn_status = models.CharField(max_length=255, verbose_name="ASN Status")
-    asn_type = models.CharField(max_length=255, verbose_name="ASN Type")
-
-    goods_code = models.CharField(max_length=255, verbose_name="Goods Code")
-    goods_desc = models.CharField(max_length=255, verbose_name="Goods Description")
-    goods_qty = models.BigIntegerField(default=0, verbose_name="Goods QTY")
-    goods_weight = models.FloatField(default=0, verbose_name="Goods Weight")
-    
-    creater = models.CharField(default='uesr', max_length=255, verbose_name="Who Created")
-    openid = models.CharField(max_length=255, verbose_name="Openid")
-    is_delete = models.BooleanField(default=False, verbose_name='Delete Label')
-    create_time = models.DateTimeField(auto_now_add=True, verbose_name="Create Time")
-    update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="Update Time")
-
-    class Meta:
-        db_table = 'asnlist'
-        verbose_name = 'ASN List'
-        verbose_name_plural = "ASN List"
-        ordering = ['-id']
-
-
-
-class AsnDetailModel(models.Model):
-    asn_code = models.CharField(max_length=255, verbose_name="ASN Code")
-    asn_status = models.CharField(max_length=255, verbose_name="ASN Status")
-    asn_type = models.CharField(max_length=255, verbose_name="ASN Type")
-
-    goods_code = models.CharField(max_length=255, verbose_name="Goods Code")
-    goods_desc = models.CharField(max_length=255, verbose_name="Goods Description")
-    goods_qty = models.BigIntegerField(default=0, verbose_name="Goods QTY")
-    goods_weight = models.FloatField(default=0, verbose_name="Goods Weight")
-
-    warehouse_code = models.CharField(default='empty_code' ,max_length=255, verbose_name="Warehouse Code")
-    warehouse_name = models.CharField(default='empty_name', max_length=255, verbose_name="Warehouse Name")
-    shelf_name=models.CharField(default='empty_name', max_length=255, verbose_name="Shelf Name")
-    container_code = models.CharField(default='empty_code', max_length=255, verbose_name="Container Code")
-    
-    creater = models.CharField(default='uesr', max_length=255, verbose_name="Who Created")
-
-    openid = models.CharField(max_length=255, verbose_name="Openid")
-    is_delete = models.BooleanField(default=False, verbose_name='Delete Label')
-    create_time = models.DateTimeField(auto_now_add=True, verbose_name="Create Time")
-    update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="Update Time")
-
-    class Meta:
-        db_table = 'asndetail'
-        verbose_name = 'ASN Detail'
-        verbose_name_plural = "ASN Detail"
-        ordering = ['-id']
-

+ 0 - 88
asn/serializers.py

@@ -1,88 +0,0 @@
-from rest_framework import serializers
-from .models import AsnListModel, AsnDetailModel
-from utils import datasolve
-
-
-class ASNListGetSerializer(serializers.ModelSerializer):
-    code = serializers.CharField(read_only=True, required=False)
-    asn_code = serializers.CharField(read_only=True, required=False)
-    asn_status = serializers.CharField(read_only=True, required=False)
-    asn_type = 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_qty = serializers.IntegerField(read_only=True, required=False)
-    goods_weight = serializers.FloatField(read_only=True, required=False)
-
-    creater = serializers.CharField(read_only=True, required=False)
-    create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
-    update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
-    class Meta:
-        model = AsnListModel
-        exclude = ['openid', 'is_delete', ]
-        read_only_fields = ['id', 'openid', ]
-
-class ASNListPostSerializer(serializers.ModelSerializer):
-    
-    openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.openid_validate])
-    asn_code = serializers.CharField(read_only=False,  required=False, validators=[datasolve.asn_data_validate])
-    code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
-    asn_status = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
-    asn_type = 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_qty = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.qty_0_data_validate])
-    goods_weight = serializers.FloatField(read_only=False, required=True, validators=[datasolve.qty_0_data_validate])
-  
-    creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
-    class Meta:
-        model = AsnListModel
-        exclude = ['is_delete', ]
-        read_only_fields = ['id', 'create_time', 'update_time', ]
-
-
-
-
-class ASNDetailGetSerializer(serializers.ModelSerializer):
-    asn_code = serializers.CharField(read_only=True, required=False)
-    asn_status = serializers.CharField(read_only=True, required=False)
-    asn_type = 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_qty = serializers.IntegerField(read_only=True, required=False)
-    goods_weight = serializers.FloatField(read_only=True, required=False)
-    warehouse_code = serializers.CharField(read_only=True, required=False)
-    warehouse_name = serializers.CharField(read_only=True, required=False)
-    shelf_name = serializers.CharField(read_only=True, required=False)
-    container_code = serializers.CharField(read_only=True, required=False)
-    creater = serializers.CharField(read_only=True, required=False)
-    create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
-
-    class Meta:
-        model = AsnDetailModel
-        exclude = ['openid', 'is_delete', ]
-        read_only_fields = ['id', 'openid']
-
-class ASNDetailPostSerializer(serializers.ModelSerializer):
-    openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.openid_validate])
-    asn_code = serializers.CharField(read_only=False,  required=True, validators=[datasolve.data_validate])
-    asn_status = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
-    asn_type = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
-    goods_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
-    goods_desc = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
-    goods_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.qty_0_data_validate])
-    goods_weight = serializers.FloatField(read_only=False, required=False, validators=[datasolve.qty_0_data_validate])
-    warehouse_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
-    warehouse_name = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
-    shelf_name = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
-    container_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
-    creater = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
-    class Meta:
-        model = AsnDetailModel
-        exclude = ['is_delete', ]
-        read_only_fields = ['id', 'create_time', 'update_time', ]
-
-
-
-
-
-

+ 0 - 0
asn/tests.py


+ 0 - 18
asn/urls.py

@@ -1,18 +0,0 @@
-from django.urls import path, re_path
-from . import views
-
-urlpatterns = [
-path(r'list/', views.AsnListViewSet.as_view({"get": "list", "post": "create"}), name="asnlist"),
-re_path(r'^list/(?P<pk>\d+)/$', views.AsnListViewSet.as_view({
-    'get': 'retrieve',
-    'put': 'update',
-    'patch': 'partial_update',
-    'delete': 'destroy'
-}), name="asnlist_1"),
-path(r'detail/', views.AsnDetailViewSet.as_view({"get": "list",  }), name="asndetail"),
-re_path(r'^detail/(?P<pk>\d+)/$', views.AsnDetailViewSet.as_view({
-    'get': 'retrieve',
-    'put': 'update',
-}), name="asndetail_1"),
-
-]

+ 0 - 219
asn/views.py

@@ -1,219 +0,0 @@
-from rest_framework import viewsets
-from utils.page import MyPageNumberPagination
-from utils.datasolve import sumOfList, transportation_calculate
-from utils.md5 import Md5
-from rest_framework.filters import OrderingFilter
-from django_filters.rest_framework import DjangoFilterBackend
-
-from rest_framework.response import Response
-from rest_framework.exceptions import APIException
-from django.utils import timezone
-
-
-
-from .models import AsnListModel, AsnDetailModel
-from .filter import AsnListFilter, AsnDetailFilter
-from .serializers import ASNListGetSerializer, ASNListPostSerializer, ASNDetailGetSerializer,ASNDetailPostSerializer
-from .files import FileListRenderCN, FileDetailRenderCN
-
-from warehouse.models import ListModel as warehouse
-
-from warehouse.models import ListModel as warehouse
-from staff.models import ListModel as staff
-
-from rest_framework.permissions import AllowAny
-
-
-
-
-class AsnListViewSet(viewsets.ModelViewSet):
-    """
-        retrieve:
-            Response a data list(get)
-        list:
-            Response a data list(all)
-        create:
-            Create a data line(post)
-
-        delete:
-            Delete a data line(delete)
-
-    """
-    authentication_classes = []  # 禁用所有认证类
-    permission_classes = [AllowAny]  # 允许任意访问
-    
-    pagination_class = MyPageNumberPagination
-    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
-    ordering_fields = ['id', "create_time", "update_time", ]
-    filter_class = AsnListFilter
-
-    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 AsnListModel.objects.filter( is_delete=False)
-            else:
-                return AsnListModel.objects.filter( id=id, is_delete=False)
-        else:
-            return AsnListModel.objects.none()
-
-    def get_serializer_class(self):
-        if self.action in ['list', 'destroy']:
-            return ASNListGetSerializer
-        elif self.action in ['create', 'update']:
-            return ASNListPostSerializer
-        else:
-            return self.http_method_not_allowed(request=self.request)
-
-    def create(self, request, *args, **kwargs):
-
-        data = self.request.data
-        if AsnListModel.objects.filter(code=data['code'], is_delete=False).exists():
-            raise APIException({"detail": "Data exists"})
-        else:
-            data['openid'] = self.request.auth.openid
-            qs_set = AsnListModel.objects.filter(openid=self.request.auth.openid,asn_type=data['asn_type'], is_delete=False)
-            order_day =str(timezone.now().strftime('%Y%m%d'))
-            if len(qs_set) > 0:
-                asn_last_code = qs_set.order_by('-id').first().asn_code
-                if str(asn_last_code[3:11]) == order_day:
-                    order_create_no = f"{int(asn_last_code[11:]) + 1:03d}"
-                    data['asn_code'] = data['asn_type'] + order_day + order_create_no
-                else:
-                    data['asn_code'] = data['asn_type'] + order_day + '001'
-            else:
-                data['asn_code'] = data['asn_type'] + order_day + '001'
-    
-            serializer = self.get_serializer(data=data)
-            serializer.is_valid(raise_exception=True)
-            serializer.save()
-
-            AsnDetailModel.objects.create(
-                openid=self.request.auth.openid,
-                asn_code=serializer.data['asn_code'],
-                asn_type=serializer.data['asn_type'],
-                asn_status=serializer.data['asn_status'],
-                
-                goods_code=serializer.data['goods_code'],
-                goods_desc=serializer.data['goods_desc'],
-                goods_qty=serializer.data['goods_qty'],
-                goods_weight=serializer.data['goods_weight'],
-
-                creater =  serializer.data['creater'],
-          
-
-            )
-            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()
-
-        qs_detail = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=data['asn_code'], is_delete=False)
-        serializer_detail = ASNDetailPostSerializer(qs_detail.first(), data=data)
-        serializer_detail.is_valid(raise_exception=True)
-        serializer_detail.save()
-
-
-        headers = self.get_success_headers(serializer.data)
-        return Response(serializer.data, status=200, headers=headers)
-
-    def destroy(self, request, pk):
-        qs = self.get_object()
-        if qs.openid != self.request.auth.openid:
-            raise APIException({"detail": "该入库非您所属,禁止删除,您可以进行编辑"})
-        else:
-            qs.is_delete = True
-            asn_detail_list = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=qs.asn_code, is_delete=False)
-            asn_detail_list.update(is_delete=True)
-            qs.save()
-            serializer = self.get_serializer(qs, many=False)
-            headers = self.get_success_headers(serializer.data)
-            return Response(serializer.data, status=200, headers=headers)
-       
-
-class AsnDetailViewSet(viewsets.ModelViewSet):
-    """
-        retrieve:
-            Response a data list(get)
-
-        list:
-            Response a data list(all)
-
-        create:
-            Create a data line(post)
-
-        update:
-            Update a data(put:update)
-    """
-    
-    pagination_class = MyPageNumberPagination
-    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
-    ordering_fields = ['id', "create_time", "update_time", ]
-    filter_class = AsnDetailFilter
-
-    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 AsnDetailModel.objects.filter( is_delete=False)
-            else:
-                return AsnDetailModel.objects.filter( id=id, is_delete=False)
-        else:
-            return AsnDetailModel.objects.none()
-
-    def get_serializer_class(self):
-        if self.action in ['list', 'destroy']:
-            return ASNDetailGetSerializer
-        elif self.action in ['update']:
-            return ASNDetailPostSerializer
-        else:
-            return self.http_method_not_allowed(request=self.request)
-
-
-    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()
-
-        qs_detail = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=data['asn_code'], is_delete=False)
-        serializer_detail = ASNDetailPostSerializer(qs_detail.first(), data=data)
-        serializer_detail.is_valid(raise_exception=True)
-        serializer_detail.save()
-
-
-        headers = self.get_success_headers(serializer.data)
-        return Response(serializer.data, status=200, headers=headers)
-
-    def destroy(self, request, pk):
-        qs = self.get_object()
-        if qs.openid != self.request.auth.openid:
-            raise APIException({"detail": "该入库非您所属,禁止删除,您可以进行编辑"})
-        else:
-            qs.is_delete = True
-            asn_detail_list = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=qs.asn_code, is_delete=False)
-            asn_detail_list.update(is_delete=True)
-            qs.save()
-            serializer = self.get_serializer(qs, many=False)
-            headers = self.get_success_headers(serializer.data)
-            return Response(serializer.data, status=200, headers=headers)

+ 3 - 1
bound/migrations/0001_initial.py

@@ -1,4 +1,4 @@
-# Generated by Django 4.1.2 on 2025-03-29 09:49
+# Generated by Django 4.1.2 on 2025-04-09 20:35
 
 from django.db import migrations, models
 import django.db.models.deletion
@@ -22,6 +22,7 @@ class Migration(migrations.Migration):
                 ('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='出库数量')),
@@ -71,6 +72,7 @@ class Migration(migrations.Migration):
             name='BoundDetailModel',
             fields=[
                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('status', models.IntegerField(choices=[(0, '入库申请'), (1, '入库中'), (2, '在库'), (3, '出库中'), (4, '已出库')], default=0, verbose_name='批次状态')),
                 ('detail_code', models.CharField(max_length=255, unique=True, verbose_name='明细编号')),
                 ('creater', models.CharField(default='uesr', max_length=255, verbose_name='Who Created')),
                 ('openid', models.CharField(max_length=255, verbose_name='Openid')),

+ 0 - 18
bound/migrations/0002_bounddetailmodel_status.py

@@ -1,18 +0,0 @@
-# Generated by Django 4.1.2 on 2025-03-29 15:53
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('bound', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='bounddetailmodel',
-            name='status',
-            field=models.IntegerField(choices=[(0, '入库申请'), (1, '入库中'), (2, '在库'), (3, '出库中'), (4, '已出库')], default=0, verbose_name='批次状态'),
-        ),
-    ]

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

@@ -1,18 +0,0 @@
-# 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__/0001_initial.cpython-38.pyc


BIN
bound/migrations/__pycache__/__init__.cpython-38.pyc


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


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


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


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


+ 3 - 0
container/filter.py

@@ -60,4 +60,7 @@ class TaskFilter(FilterSet):
             "id": ['exact', 'gt', 'gte', 'lt', 'lte', 'isnull', 'in', 'range'],
             "task_wcs" : ['exact'],
             "container_detail" : ['exact'],
+            "batch_detail": ['exact'],
+            "container_detail__goods_code": ['exact', 'icontains'],
+            "container_detail__goods_desc": ['exact', 'icontains'],  
             }

+ 3 - 3
container/migrations/0001_initial.py

@@ -1,4 +1,4 @@
-# Generated by Django 4.1.2 on 2025-04-09 15:56
+# Generated by Django 4.1.2 on 2025-04-09 20:35
 
 from django.db import migrations, models
 import django.db.models.deletion
@@ -9,7 +9,7 @@ class Migration(migrations.Migration):
     initial = True
 
     dependencies = [
-        ('bound', '0003_boundbatchmodel_goods_std'),
+        ('bound', '0001_initial'),
     ]
 
     operations = [
@@ -79,7 +79,7 @@ class Migration(migrations.Migration):
             name='TaskModel',
             fields=[
                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('bound_detail', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bound.bounddetailmodel', verbose_name='绑定明细')),
+                ('batch_detail', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bound.bounddetailmodel', verbose_name='批次详情')),
                 ('container_detail', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='container.containerdetailmodel', verbose_name='托盘明细')),
                 ('task_wcs', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='container.containerwcsmodel')),
             ],

+ 0 - 20
container/migrations/0002_alter_taskmodel_bound_detail.py

@@ -1,20 +0,0 @@
-# Generated by Django 4.1.2 on 2025-04-09 16:27
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('bound', '0003_boundbatchmodel_goods_std'),
-        ('container', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='taskmodel',
-            name='bound_detail',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bound.bounddetailmodel', verbose_name='批次明细'),
-        ),
-    ]

+ 0 - 20
container/migrations/0003_alter_taskmodel_bound_detail.py

@@ -1,20 +0,0 @@
-# Generated by Django 4.1.2 on 2025-04-09 16:57
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('bound', '0003_boundbatchmodel_goods_std'),
-        ('container', '0002_alter_taskmodel_bound_detail'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='taskmodel',
-            name='bound_detail',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bound.boundbatchmodel', verbose_name='批次明细'),
-        ),
-    ]

+ 0 - 17
container/migrations/0004_remove_taskmodel_bound_detail.py

@@ -1,17 +0,0 @@
-# Generated by Django 4.1.2 on 2025-04-09 17:10
-
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('container', '0003_alter_taskmodel_bound_detail'),
-    ]
-
-    operations = [
-        migrations.RemoveField(
-            model_name='taskmodel',
-            name='bound_detail',
-        ),
-    ]

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


BIN
container/migrations/__pycache__/__init__.cpython-38.pyc


+ 3 - 1
container/models.py

@@ -1,5 +1,5 @@
 from django.db import models
-from bound.models import BoundBatchModel
+from bound.models import BoundBatchModel,BoundDetailModel
 
 # Create your models here.
 # 主表:托盘数据
@@ -117,7 +117,9 @@ class ContainerWCSModel(models.Model):
 class TaskModel(models.Model):
     
     task_wcs = models.ForeignKey(ContainerWCSModel, on_delete=models.CASCADE, related_name='tasks')
+    batch_detail = models.ForeignKey(BoundDetailModel, on_delete=models.CASCADE, verbose_name='批次详情')
     container_detail = models.ForeignKey(ContainerDetailModel, on_delete=models.CASCADE, verbose_name='托盘明细')
+
     class Meta:
         db_table = 'task'
         verbose_name = 'Task'

+ 5 - 0
container/serializers.py

@@ -174,6 +174,7 @@ class TaskGetSerializer(serializers.ModelSerializer):
     # 定义任务记录的序列化器,用于获取操作,字段只读
     task_wcs = serializers.SerializerMethodField()
     container_detail = serializers.SerializerMethodField()
+    batch_detail = serializers.SerializerMethodField()
 
 
     def get_task_wcs(self, obj):
@@ -185,6 +186,10 @@ class TaskGetSerializer(serializers.ModelSerializer):
         """ 动态序列化关联的主单数据 """
         from .serializers import ContainerDetailGetSerializer
         return ContainerDetailGetSerializer(obj.container_detail).data
+    def get_batch_detail(self, obj):
+        """ 动态序列化关联的批次数据 """
+        from bound.serializers import BoundDetailGetSerializer
+        return BoundDetailGetSerializer(obj.batch_detail).data
 
     class Meta:
         # 指定模型和排除字段

+ 2 - 2
container/views.py

@@ -279,11 +279,11 @@ class ContainerWCSViewSet(viewsets.ModelViewSet):
                 if container_detail_obj:
                     for detail in container_detail_obj:
                         # 保存到数据库
-                        batch = BoundBatchModel.objects.filter(id=detail.batch.id).first()
+                        batch = BoundDetailModel.objects.filter(bound_batch_id=detail.batch.id).first()
                         TaskModel.objects.create(
                             task_wcs = task_obj,
                             container_detail = detail,
-
+                            batch_detail = batch
                         )
                         logger.info(f"入库任务 {wcs_id} 已更新")
                 else:

BIN
db.sqlite3


+ 28 - 0
logs/server.log

@@ -2336,3 +2336,31 @@ Traceback (most recent call last):
   File "D:\Document\code\vue\greater_wms\.\container\serializers.py", line 180, in get_task_wcs
     from wcs.serializers import TaskGetSerializer
 ModuleNotFoundError: No module named 'wcs'
+[2025-04-09 21:04:26,862][django.request.log_response():241] [WARNING] Not Found: /container//
+[2025-04-09 21:22:26,900][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-09 21:25:08,778][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-09 21:25:14,111][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-09 21:25:17,633][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-09 21:25:25,517][django.request.log_response():241] [WARNING] Not Found: /asn/detail/
+[2025-04-09 21:54:01,599][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-09 21:54:04,072][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-09 21:54:10,769][django.request.log_response():241] [WARNING] Not Found: /goodsunit/
+[2025-04-09 21:54:12,870][django.request.log_response():241] [WARNING] Not Found: /goodsclass/
+[2025-04-09 21:54:13,594][django.request.log_response():241] [WARNING] Not Found: /goodscolor/
+[2025-04-09 21:54:14,120][django.request.log_response():241] [WARNING] Not Found: /goodsbrand/
+[2025-04-09 21:54:14,646][django.request.log_response():241] [WARNING] Not Found: /goodsshape/
+[2025-04-09 21:54:15,051][django.request.log_response():241] [WARNING] Not Found: /goodsspecs/
+[2025-04-09 21:54:15,521][django.request.log_response():241] [WARNING] Not Found: /goodsorigin/
+[2025-04-09 21:54:16,581][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-09 21:54:23,579][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-09 21:56:46,184][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-09 21:57:43,766][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-09 21:57:47,979][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-09 21:58:41,611][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-09 21:58:56,309][django.request.log_response():241] [WARNING] Not Found: /goods/
+[2025-04-09 21:59:40,124][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-09 21:59:54,592][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-09 22:00:07,412][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-09 22:00:40,177][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-11 15:46:07,182][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-11 15:47:57,007][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/

+ 0 - 7
templates/src/layouts/MainLayout.vue

@@ -118,13 +118,6 @@
             <q-item-section>{{ $t("menuItem.outbound") }}</q-item-section>
           </q-item>
 
-          <q-separator />
-
-          <q-item clickable :to="{ name: 'goodslist' }" @click="linkChange('goods')" v-ripple exact
-            :active="link === 'goods' && link !== ''" :class="{ 'my-menu-link': link === 'goods' && link !== '' }">
-            <q-item-section avatar><q-icon name="shop_two" /></q-item-section>
-            <q-item-section>{{ $t("menuItem.goods") }}</q-item-section>
-          </q-item>
 
           <q-separator />
 

+ 398 - 0
templates/src/pages/container/containeroperate copy.vue

@@ -0,0 +1,398 @@
+<template>
+  <div style="margin-top: 42px;">
+
+    <transition appear enter-active-class="animated fadeIn">
+      <q-table class="my-sticky-header-column-table shadow-24" :data="table_list" row-key="id" :separator="separator"
+        :loading="loading" :columns="columns" hide-bottom :pagination.sync="pagination" no-data-label="No data"
+        no-results-label="No data you want" :table-style="{ height: height }" flat bordered>
+        <template v-slot:top>
+          <q-btn-group push>
+
+            <q-btn :label="$t('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-group>
+
+          <q-space />
+
+          <div class="flex items-center">
+            <div class="q-mr-md">{{ $t("download_center.createTime") }}</div>
+            <q-input readonly outlined dense v-model="createDate2" :placeholder="interval">
+              <template v-slot:append>
+                <q-icon name="event" class="cursor-pointer">
+                  <q-popup-proxy ref="qDateProxy" transition-show="scale" transition-hide="scale">
+                    <q-date v-model="createDate1" range>
+                      <div class="row items-center justify-end q-gutter-sm">
+                        <q-btn :label="$t('index.cancel')" color="primary" flat v-close-popup />
+                        <q-btn :label="$t('index.clear')" color="primary" @click="createDate2 = ''; createDate1 = '';"
+                          v-close-popup />
+
+                      </div>
+                    </q-date>
+                  </q-popup-proxy>
+                </q-icon>
+              </template>
+            </q-input>
+            <q-btn-group push class="q-ml-md">
+            </q-btn-group>
+            <q-input outlined rounded dense debounce="300" color="primary" v-model="filter" :placeholder="$t('search')"
+              @input="getSearchList()" @keyup.enter="getSearchList()">
+              <template v-slot:append>
+                <q-icon name="search" @click="getSearchList()" />
+              </template>
+            </q-input>
+          </div>
+        </template>
+        <template v-slot:body="props">
+          <q-tr :props="props">
+            <template >
+              <q-td key="document_date" :props="props">{{ props.row.batch_detail.bound_list.bound_date }}</q-td>
+            </template>            
+            <template >
+              <q-td key="document_number" :props="props">{{ props.row.batch_detail.bound_list.bound_code }}</q-td>
+            </template>
+            <template >
+              <q-td key="document_type" :props="props">{{ props.row.batch_detail.bound_list.bound_code_type }}</q-td>
+            </template>            
+            <template >
+              <q-td key="business_type" :props="props">{{ props.row.batch_detail.bound_list.bound_bs_type }}</q-td>
+            </template>
+            <template >
+              <q-td key="iout_type" :props="props">{{ props.row.batch_detail.bound_list.bound_type  }}</q-td>
+            </template>            
+            <template >
+              <q-td key="department" :props="props">{{ props.row.batch_detail.bound_list.bound_department }}</q-td>
+            </template>            
+            <template >
+              <q-td key="warehouse_code" :props="props">{{ props.row.batch_detail.bound_batch.warehouse_code }}</q-td>
+            </template>            
+            <template >
+              <q-td key="warehouse_name" :props="props">{{ props.row.batch_detail.bound_batch.warehouse_name }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_code" :props="props">{{ props.row.batch_detail.bound_batch.goods_code }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_desc" :props="props">{{ props.row.batch_detail.bound_batch.goods_desc }}</q-td>
+            </template>            
+            
+            <template >
+              <q-td key="goods_std" :props="props">{{ props.row.batch_detail.bound_batch.goods_std }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_batch" :props="props">{{ props.row.container_detail.batch.bound_number }}</q-td>
+            </template>            
+            <template >
+              <q-td key="in_batch" :props="props">{{ props.row.container_detail.batch.goods_code}}</q-td>
+            </template>            
+            <template >
+              <q-td key="out_batch" :props="props">{{ props.row.batch_detail.bound_batch.out_batch }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_unit" :props="props">{{ props.row.batch_detail.bound_batch.goods_unit }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_in" :props="props">{{ props.row.batch_detail.bound_batch.goods_in }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_out" :props="props">{{ props.row.batch_detail.bound_list.goods_out }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_notes" :props="props">{{ props.row.task_wcs.message}}</q-td>
+            </template>            
+            <template >
+              <q-td key="creator" :props="props">{{ props.row.container_detail.creater}}</q-td>
+            </template>            
+ 
+
+
+
+
+
+
+          </q-tr>
+        </template>
+      </q-table>
+    </transition>
+    <template>
+      <div v-show="max !== 0" class="q-pa-lg flex flex-center">
+        <div>{{ total }} </div>
+        <q-pagination v-model="current" color="black" :max="max" :max-pages="6" boundary-links
+          @click="getSearchList(current); paginationIpt = current" />
+        <div>
+          <input v-model="paginationIpt" @blur="changePageEnter" @keyup.enter="changePageEnter"
+            style="width: 60px; text-align: center" />
+        </div>
+      </div>
+      <div v-show="max === 0" class="q-pa-lg flex flex-center">
+        <q-btn flat push color="dark" :label="$t('no_data')"></q-btn>
+      </div>
+    </template>
+
+  </div>
+</template>
+<router-view />
+
+<script>
+import { getauth, postauth, putauth, deleteauth } from 'boot/axios_request'
+import { date, exportFile, LocalStorage } from 'quasar'
+
+
+export default {
+  name: 'PageTask',
+  data() {
+    return {
+      createDate1: '',
+      createDate2: '',
+      date_range: '',
+      proxyDate: '',
+      date: '',
+      goods_code: '',
+      goods_desc: '',
+      openid: '',
+      login_name: '',
+      authin: '0',
+      searchUrl: '',
+      pathname: 'container/task/',
+
+      pathname_previous: '',
+      pathname_next: '',
+      separator: 'cell',
+      loading: false,
+      height: '',
+      viewForm: false,
+
+      table_list: [],
+      columns: [
+          { name: 'document_date', required: true, label: '单据日期', align: 'left', field: 'document_date' },
+          { name: 'document_number', label: '单据编号', field: 'document_number', align: 'center' },
+          { name: 'document_type', label: '单据类型', field: 'document_type', align: 'center' },
+          { name: 'business_type', label: '业务类型', field: 'business_type', align: 'center' },
+          { name: 'iout_type', label: '出入库类型', field: 'iout_type', align: 'center' },
+          { name: 'department', label: '部门', field: 'department', align: 'center' },
+          { name: 'warehouse_code', label: '仓库编码', field: 'warehouse_code', align: 'center' },
+          { name: 'warehouse_name', label: '仓库名称', field: 'warehouse_name', align: 'center' },
+          { name: 'goods_code', label: '存货编码', field: 'goods_code', align: 'center' },
+          { name: 'goods_desc', label: '存货', field: 'goods_desc', align: 'center' },
+          { name: 'goods_std', label: '规格型号', field: 'goods_std', align: 'center' },
+          { name: 'goods_batch', label: '批号', field: 'goods_batch', align: 'center' },
+          { name: 'in_batch', label: '入库批号', field: 'in_batch', align: 'center' },
+          { name: 'out_batch', label: '出库批号', field: 'out_batch', align: 'center' },
+          { name: 'goods_unit', label: '计量单位', field: 'goods_unit', align: 'center' },
+          { name: 'goods_in', label: '本期入库', field: 'goods_in', align: 'center' },
+          { name: 'goods_out', label: '本期出库', field: 'goods_out', align: 'center' },
+          { name: 'goods_notes', label: '备注', field: 'goods_notes', align: 'center' },
+          { name: 'creator', label: '创建人', field: 'creator', align: 'center' },
+
+        ],
+      filter: '',
+      pagination: {
+        page: 1,
+        rowsPerPage: 11
+      },
+      current: 1,
+      max: 0,
+      total: 0,
+      paginationIpt: 1,
+      current: 1,
+
+    }
+
+  },
+  computed: {
+    interval() {
+      return this.$t('download_center.start') + ' - ' + this.$t('download_center.end')
+    }
+  },
+  methods: {
+    getList(params = {}) {
+      var _this = this
+      _this.loading = true
+      // 合并基础参数
+      const baseParams = {
+        page: _this.current,
+        page_size: _this.pagination.rowsPerPage
+      }
+
+      // 创建URLSearchParams处理参数
+      const queryParams = new URLSearchParams({
+        ...baseParams,
+        ...params
+      })
+      console.log(queryParams)
+      // 过滤空值参数
+      Array.from(queryParams.entries()).forEach(([key, value]) => {
+        if (value === '' || value === null || value === undefined) {
+          queryParams.delete(key)
+        }
+      })
+
+      getauth(`${_this.pathname}?${queryParams}`)
+        .then(res => {
+          _this.table_list = res.results
+          _this.total = res.count
+          _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage) || 0
+          _this.pathname_previous = res.previous
+          _this.pathname_next = res.next
+        })
+        .catch(err => {
+          _this.$q.notify({
+            message: err.detail,
+            icon: 'close',
+            color: 'negative'
+          })
+        })
+        .finally(() => {
+          _this.loading = false
+        })
+    },
+    changePageEnter() {
+      if (Number(this.paginationIpt) < 1) {
+        this.current = 1
+        this.paginationIpt = 1
+      } else if (Number(this.paginationIpt) > this.max) {
+        this.current = this.max
+        this.paginationIpt = this.max
+      } else {
+        this.current = Number(this.paginationIpt)
+      }
+      this.getSearchList(this.current)
+    },
+
+    // 带搜索条件加载
+    getSearchList(page = 1) {
+      this.current = page
+      this.paginationIpt = page
+      this.getList({
+        goods_desc__icontains: this.filter,
+        create_time__range: this.date_range
+      })
+    },
+
+    getListPrevious() {
+      var _this = this
+      if (LocalStorage.has('auth')) {
+        getauth(_this.pathname_previous, {})
+          .then(res => {
+            _this.table_list = res.results
+            _this.pathname_previous = res.previous
+            _this.pathname_next = res.next
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+      } else {
+      }
+    },
+    getListNext() {
+      var _this = this
+      if (LocalStorage.has('auth')) {
+        getauth(_this.pathname_next, {})
+          .then(res => {
+            _this.table_list = res.results
+
+            _this.pathname_previous = res.previous
+            _this.pathname_next = res.next
+          })
+          .catch(err => {
+            _this.$q.notify({
+              message: err.detail,
+              icon: 'close',
+              color: 'negative'
+            })
+          })
+      }
+    },
+    reFresh() {
+      var _this = this
+      _this.getSearchList()
+    },
+
+
+    updateProxy() {
+      var _this = this
+      _this.proxyDate = _this.date
+    }
+
+  },
+  created() {
+    var _this = this
+    if (LocalStorage.has('openid')) {
+      _this.openid = LocalStorage.getItem('openid')
+    } else {
+      _this.openid = ''
+      LocalStorage.set('openid', '')
+    }
+    if (LocalStorage.has('login_name')) {
+      _this.login_name = LocalStorage.getItem('login_name')
+    } else {
+      _this.login_name = ''
+      LocalStorage.set('login_name', '')
+    }
+    if (LocalStorage.has('auth')) {
+      const timeStamp = Date.now()
+      const formattedString = date.formatDate(timeStamp, 'YYYY/MM/DD')
+      _this.date = formattedString
+      console.log(_this.date)
+      _this.authin = '1'
+      _this.getList()
+    } else {
+      _this.authin = '0'
+    }
+  },
+  mounted() {
+    var _this = this
+    if (_this.$q.platform.is.electron) {
+      _this.height = String(_this.$q.screen.height - 290) + 'px'
+    } else {
+      _this.height = _this.$q.screen.height - 290 + '' + 'px'
+    }
+  },
+  updated() { },
+  destroyed() { },
+  // 在 watch 或方法中添加调试代码
+  watch: {
+    createDate1(val) {
+      if (val) {
+        if (val.to) {
+          this.createDate2 = `${val.from} - ${val.to}`
+          this.date_range = `${val.from},${val.to} `
+
+          // this.downloadhUrl = this.pathname + 'filelist/?' + 'document_date__range=' + this.date_range
+        } else {
+          this.createDate2 = `${val}`
+          this.dateArray = val.split('/')
+          this.searchUrl = this.pathname + '?' + 'document_date__year=' + this.dateArray[0] + '&' + 'document_date__month=' + this.dateArray[1] + '&' + 'document_date__day=' + this.dateArray[2]
+          // this.downloadhUrl = this.pathname + 'filelist/?' + 'document_date__year=' + this.dateArray[0] + '&' + 'document_date__month=' + this.dateArray[1] + '&' + 'document_date__day=' + this.dateArray[2]
+        }
+        this.date_range = this.date_range.replace(/\//g, '-')
+
+        this.getSearchList()
+        this.$refs.qDateProxy.hide()
+      }
+      else {
+        this.createDate2 = ''
+        this.date_range = ''
+        this.getSearchList()
+      }
+    }
+  }
+}
+</script>
+<style scoped>
+/* 添加在 <style> 中 */
+.q-date__calendar-item--selected {
+  transition: all 0.3s ease;
+  background-color: #1976d2 !important;
+}
+
+.q-date__range {
+  background-color: rgba(25, 118, 210, 0.1);
+}
+</style>

File diff suppressed because it is too large
+ 343 - 900
templates/src/pages/container/containeroperate.vue


+ 104 - 426
templates/src/pages/inbound/sortstock.vue

@@ -1,16 +1,13 @@
 <template>
-  <div>
+  <div >
+
     <transition appear enter-active-class="animated fadeIn">
       <q-table class="my-sticky-header-column-table shadow-24" :data="table_list" row-key="id" :separator="separator"
         :loading="loading" :columns="columns" hide-bottom :pagination.sync="pagination" no-data-label="No data"
         no-results-label="No data you want" :table-style="{ height: height }" flat bordered>
         <template v-slot:top>
           <q-btn-group push>
-<!-- 
-            <q-btn :label="$t('new')" icon="add" @click="newForm = true; newFormData.creater = login_name">
-              <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>
@@ -21,7 +18,25 @@
           <q-space />
 
           <div class="flex items-center">
-
+            <div class="q-mr-md">{{ $t("download_center.createTime") }}</div>
+            <q-input readonly outlined dense v-model="createDate2" :placeholder="interval">
+              <template v-slot:append>
+                <q-icon name="event" class="cursor-pointer">
+                  <q-popup-proxy ref="qDateProxy" transition-show="scale" transition-hide="scale">
+                    <q-date v-model="createDate1" range>
+                      <div class="row items-center justify-end q-gutter-sm">
+                        <q-btn :label="$t('index.cancel')" color="primary" flat v-close-popup />
+                        <q-btn :label="$t('index.clear')" color="primary" @click="createDate2 = ''; createDate1 = '';"
+                          v-close-popup />
+
+                      </div>
+                    </q-date>
+                  </q-popup-proxy>
+                </q-icon>
+              </template>
+            </q-input>
+            <q-btn-group push class="q-ml-md">
+            </q-btn-group>
             <q-input outlined rounded dense debounce="300" color="primary" v-model="filter" :placeholder="$t('search')"
               @input="getSearchList()" @keyup.enter="getSearchList()">
               <template v-slot:append>
@@ -32,139 +47,71 @@
         </template>
         <template v-slot:body="props">
           <q-tr :props="props">
-
-
-            <template v-if="props.row.id === editid">
-              <q-td key="asn_code" :props="props">{{ props.row.asn_code }}</q-td>
-            </template>
-            <template v-else-if="props.row.id !== editid">
-              <q-td key="asn_code" :props="props">{{ props.row.asn_code }}</q-td>
-            </template>
-
-
-            <template v-if="props.row.id === editid">
-              <q-td key="goods_code" :props="props">
-                <q-input dense outlined square v-model="editFormData.goods_code" :label="'存货编码'"
-                  :rules="[val => (val && val.length > 0) || error8]" />
-              </q-td>
-            </template>
-            <template v-else-if="props.row.id !== editid">
-              <q-td key="goods_code" :props="props">{{ props.row.goods_code }}</q-td>
-            </template>
-
-            <template v-if="props.row.id === editid">
-              <q-td key="goods_desc" :props="props">
-                <q-input dense outlined square v-model="editFormData.goods_desc" :label="'存货名称'"
-                  :rules="[val => (val && val.length > 0) || error8]" />
-              </q-td>
-            </template>
-            <template v-else-if="props.row.id !== editid">
-              <q-td key="goods_desc" :props="props">{{ props.row.goods_desc }}</q-td>
-            </template>
-
-            <template v-if="props.row.id === editid">
-              <q-td key="goods_qty" :props="props">
-                <q-input dense outlined square v-model.number="editFormData.goods_qty" :label="'入库数量'" type="number"
-                  :rules="[val => (val && val > 0) || error8]" />
-              </q-td>
-            </template>
-            <template v-else-if="props.row.id !== editid">
-              <q-td key="goods_qty" :props="props">{{ props.row.goods_qty }}</q-td>
+            <template >
+              <q-td key="document_date" :props="props">{{ props.row.batch_detail.bound_list.bound_date }}</q-td>
+            </template>            
+            <template >
+              <q-td key="document_number" :props="props">{{ props.row.batch_detail.bound_list.bound_code }}</q-td>
             </template>
-
-            <template v-if="props.row.id === editid">
-              <q-td key="goods_weight" :props="props">
-                <q-input dense outlined square v-model.number="editFormData.goods_weight" :label="'入库重量'" type="number"
-                  :rules="[val => (val && val > 0) || error8]" />
-              </q-td>
-            </template>
-            <template v-else-if="props.row.id !== editid">
-              <q-td key="goods_weight" :props="props">{{ props.row.goods_weight }}</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="'仓库'"
-                  :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="shelf_name" :props="props">
-                <q-input dense outlined square v-model.number="editFormData.shelf_name" :label="'货架'"
-                  :rules="[val => (val && val > 0) || error8]" />
-              </q-td>
-            </template>
-            <template v-else-if="props.row.id !== editid">
-              <q-td key="shelf_name" :props="props">{{ props.row.shelf_name }}</q-td>
-            </template>
-
-            <template v-if="props.row.id === editid">
-              <q-td key="container_code" :props="props">
-                <q-input dense outlined square v-model.number="editFormData.container_code" :label="'托盘编码'"
-                  :rules="[val => (val && val.length > 0) || error8]" />
-              </q-td>
-            </template>
-            <template v-else-if="props.row.id !== editid">
-              <q-td key="container_code" :props="props">{{ props.row.container_code }}</q-td>
+            <template >
+              <q-td key="document_type" :props="props">{{ props.row.batch_detail.bound_list.bound_code_type }}</q-td>
+            </template>            
+            <template >
+              <q-td key="business_type" :props="props">{{ props.row.batch_detail.bound_list.bound_bs_type }}</q-td>
             </template>
+            <template >
+              <q-td key="iout_type" :props="props">{{ props.row.batch_detail.bound_list.bound_type  }}</q-td>
+            </template>            
+            <template >
+              <q-td key="department" :props="props">{{ props.row.batch_detail.bound_list.bound_department }}</q-td>
+            </template>            
+            <template >
+              <q-td key="warehouse_code" :props="props">{{ props.row.batch_detail.bound_batch.warehouse_code }}</q-td>
+            </template>            
+            <template >
+              <q-td key="warehouse_name" :props="props">{{ props.row.batch_detail.bound_batch.warehouse_name }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_code" :props="props">{{ props.row.batch_detail.bound_batch.goods_code }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_desc" :props="props">{{ props.row.batch_detail.bound_batch.goods_desc }}</q-td>
+            </template>            
+            
+            <template >
+              <q-td key="goods_std" :props="props">{{ props.row.batch_detail.bound_batch.goods_std }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_batch" :props="props">{{ props.row.container_detail.batch.bound_number }}</q-td>
+            </template>            
+            <template >
+              <q-td key="in_batch" :props="props">{{ props.row.container_detail.batch.goods_code}}</q-td>
+            </template>            
+            <template >
+              <q-td key="out_batch" :props="props">{{ props.row.batch_detail.bound_batch.out_batch }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_unit" :props="props">{{ props.row.batch_detail.bound_batch.goods_unit }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_in" :props="props">{{ props.row.container_detail.goods_qty }}</q-td>
+            </template>            
+            <template >
+              <q-td key="container_number" :props="props">{{ props.row.container_detail.container.container_code }}</q-td>
+            </template>            
+            <template >
+              <q-td key="goods_notes" :props="props">{{ props.row.task_wcs.message}}</q-td>
+            </template>            
+            <template >
+              <q-td key="creator" :props="props">{{ props.row.container_detail.creater}}</q-td>
+            </template>            
+ 
 
 
 
-            <template v-if="props.row.id === editid">
-              <q-td key="creater" :props="props">
-                <q-input dense outlined square v-model.number="editFormData.creater" :label="'经办人'"
-                  :rules="[val => (val && val > 0) || error8]" />
-              </q-td>
-            </template>
-            <template v-else-if="props.row.id !== editid">
-              <q-td key="creater" :props="props">{{ props.row.creater }}</q-td>
-            </template>
 
-            <template v-if="props.row.id === editid">
-              <q-td key="asn_status" :props="props">
-                <q-td key="asn_status" :props="props">{{ props.row.asn_status }}</q-td>
-              </q-td>
-            </template>
-            <template v-else-if="props.row.id !== editid">
-              <q-td key="asn_status" :props="props">{{ props.row.asn_status }}</q-td>
-            </template>
 
 
-            <template v-if="!editMode">
-              <q-td key="action" :props="props" style="width: 100px">
-                <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="trolley" @click="change_status(props.row)">
-                  <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
-                    content-style="font-size: 12px">一键分拣</q-tooltip>
-                </q-btn>
-                <q-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>
@@ -183,57 +130,6 @@
         <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.code" :label="'到货编码'" autofocus
-            :rules="[val => (val && val.length > 0) || error1]" />
-
-          <q-input dense outlined square v-model="newFormData.goods_code" :label="'存货编码'"
-            :rules="[val => (val && val.length > 0) || error8]" />
-          <q-input dense outlined square v-model="newFormData.goods_desc" :label="'存货名称'"
-            :rules="[val => (val && val.length > 0) || error8]" />
-          <q-input dense outlined square v-model.number="newFormData.goods_qty" :label="'入库数量'" type="number"
-            :rules="[val => (val && val > 0) || error8]" />
-          <q-input dense outlined square v-model.number="newFormData.goods_weight" :label="'入库重量'" type="number"
-            :rules="[val => (val && val > 0) || error8]" />
-
-          <q-input dense outlined square v-model.number="newFormData.creater" :label="'经办人'"
-            :rules="[val => (val && val > 0) || error8]" />
-
-        </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>
 
   </div>
 </template>
@@ -245,7 +141,7 @@ import { date, exportFile, LocalStorage } from 'quasar'
 
 
 export default {
-  name: 'Pagesorted',
+  name: 'PageTask',
   data() {
     return {
       createDate1: '',
@@ -259,58 +155,45 @@ export default {
       login_name: '',
       authin: '0',
       searchUrl: '',
-      pathname: 'asn/detail/',
-      pathfilename: 'asn/file/',
+      pathname: 'container/task/',
 
       pathname_previous: '',
       pathname_next: '',
       separator: 'cell',
       loading: false,
       height: '',
+      viewForm: false,
 
-      printObj: {
-        id: 'printMe',
-        popTitle: this.$t('inbound.asn')
-      },
       table_list: [],
-
       columns: [
-        { name: 'asn_code', label: '入库单号', field: 'asn_code', align: 'center' },
-        { name: 'goods_code', label: '存货编码', field: 'goods_code', align: 'center' },
-        { name: 'goods_desc', label: '存货', field: 'goods_desc', align: 'center' },
-        { name: 'goods_qty', label: '数量', field: 'goods_qty', align: 'center' },
-        { name: 'goods_weight', label: '重量', field: 'goods_weight', align: 'center' },
-        { name: 'warehouse_name', label: '仓库', field: 'warehouse_name', align: 'center' },
-        { name: 'shelf_name', label: '货架', field: 'shelf_name', align: 'center' },
-        { name: 'container_code', label: '托盘编码', field: 'container_code', align: 'center' },
-
-        { name: 'creater', label: '经办人', field: 'creater', align: 'center' },
-        { name: 'asn_status', label: '状态', field: 'asn_status', align: 'center' },
-        { name: 'action', label: '操作', align: 'center' }
-      ],
+          { name: 'document_date', required: true, label: '入库时间', align: 'center', field: 'document_date' },
+          { name: 'document_number', label: '单据编号', field: 'document_number', align: 'center' },
+          { name: 'department', label: '部门', field: 'department', align: 'center' },
+
+          { name: 'goods_code', label: '存货编码', field: 'goods_code', align: 'center' },
+          { name: 'goods_desc', label: '存货', field: 'goods_desc', align: 'center' },
+          { name: 'goods_std', label: '规格型号', field: 'goods_std', align: 'center' },
+          { name: 'goods_batch', label: '入库批号', field: 'goods_batch', align: 'center' },
+
+
+          { name: 'goods_in', label: '入库数目', field: 'goods_in', align: 'center' },
+          { name: 'container_number', label: '托盘编码', field: 'container_number', align: 'center' },
+
+          // { name: 'goods_notes', label: '备注', field: 'goods_notes', align: 'center' },
+          { name: 'creator', label: '创建人', field: 'creator', align: 'center' },
+
+        ],
       filter: '',
       pagination: {
         page: 1,
         rowsPerPage: 11
       },
-      newForm: false,
-      newFormData: {
-
-      },
-      editid: 0,
-      editFormData: {
-
-      },
-      editMode: false,
-      deleteForm: false,
-      deleteid: 0,
-      bar_code: '',
-      error1: this.$t('goods.view_goodslist.error1'),
-
+      current: 1,
       max: 0,
       total: 0,
       paginationIpt: 1,
       current: 1,
+
     }
 
   },
@@ -345,7 +228,6 @@ export default {
       getauth(`${_this.pathname}?${queryParams}`)
         .then(res => {
           _this.table_list = res.results
-
           _this.total = res.count
           _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage) || 0
           _this.pathname_previous = res.previous
@@ -380,56 +262,10 @@ export default {
       this.current = page
       this.paginationIpt = page
       this.getList({
-        goods_desc__icontains: this.filter,
-        document_date__range: this.date_range
+        container_detail__goods_desc__icontains: this.filter,
+        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
@@ -474,163 +310,6 @@ export default {
       _this.getSearchList()
     },
 
-    newDataSubmit() {
-      var _this = this
-      _this.newFormData.asn_type = 'INT';
-      _this.newFormData.asn_status = '待分拣'
-
-      postauth(_this.pathname, _this.newFormData)
-        .then(res => {
-          _this.getSearchList()
-          _this.newDataCancel()
-          if (res.status_code != 500) {
-            _this.$q.notify({
-              message: '成功新增数据',
-              icon: 'check',
-              color: 'green'
-            })
-          }
-        })
-        .catch(err => {
-          _this.$q.notify({
-            message: err.detail,
-            icon: 'close',
-            color: 'negative'
-          })
-        })
-    },
-    newDataCancel() {
-      var _this = this
-      _this.newForm = false
-      _this.newFormData = {
-        code: '',
-        goods_code: '',
-        goods_desc: '',
-        goods_qty: '',
-        goods_weight: '',
-        creater: ''
-      }
-    },
-    editData(e) {
-      var _this = this
-      _this.editMode = true
-      _this.editid = e.id
-      _this.editFormData = {
-        code: e.code,
-        asn_code: e.asn_code,
-        asn_status: e.asn_status,
-        goods_code: e.goods_code,
-        goods_desc: e.goods_desc,
-        goods_qty: e.goods_qty,
-        goods_weight: e.goods_weight,
-        creater: _this.login_name,
-      }
-
-    },
-    change_status(e) {
-      var _this = this
-      
-      var status_FormData = {
-        code: e.code,
-        asn_code: e.asn_code,
-        asn_status: e.asn_status,
-        goods_code: e.goods_code,
-        goods_desc: e.goods_desc,
-        goods_qty: e.goods_qty,
-        goods_weight: e.goods_weight,
-        creater: _this.login_name,
-      }
-      status_FormData.asn_type = 'INT';
-      status_FormData.asn_status = '入库中'
-      putauth(_this.pathname + e.id + '/', status_FormData)
-        .then(res => {
-          _this.editDataCancel()
-          _this.getSearchList()
-          if (res.status_code != 500) {
-            _this.$q.notify({
-              message: '开始入库',
-              icon: 'check',
-              color: 'green'
-            })
-          }
-        })
-        .catch(err => {
-          _this.$q.notify({
-            message: err.detail,
-            icon: 'close',
-            color: 'negative'
-          })
-        })
-    },
-    editDataSubmit() {
-      var _this = this
-      _this.editFormData.asn_type = 'INT'
-
-      putauth(_this.pathname + _this.editid + '/', _this.editFormData)
-        .then(res => {
-          _this.editDataCancel()
-          _this.getSearchList()
-          if (res.status_code != 500) {
-            _this.$q.notify({
-              message: '成功编辑数据',
-              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 = {
-        code: '',
-        asn_code: '',
-        asn_status: '',
-        goods_code: '',
-        goods_desc: '',
-        goods_qty: '',
-        goods_weight: '',
-        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: '成功删除数据',
-            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
-    },
 
     updateProxy() {
       var _this = this
@@ -670,11 +349,10 @@ export default {
     } else {
       _this.height = _this.$q.screen.height - 290 + '' + 'px'
     }
-    _this.newFormData.creater = _this.login_name
   },
   updated() { },
   destroyed() { },
-
+  // 在 watch 或方法中添加调试代码
   watch: {
     createDate1(val) {
       if (val) {