Browse Source

增加ERP模块

flower_mr 1 tháng trước cách đây
mục cha
commit
b4406664f1
34 tập tin đã thay đổi với 1703 bổ sung1619 xóa
  1. BIN
      bound/__pycache__/filter.cpython-38.pyc
  2. BIN
      bound/__pycache__/models.cpython-38.pyc
  3. BIN
      bound/__pycache__/serializers.cpython-38.pyc
  4. BIN
      bound/__pycache__/views.cpython-38.pyc
  5. 1 1
      bound/filter.py
  6. 44 0
      bound/migrations/0005_outboundmodel_boundbatchmodel_note.py
  7. 27 0
      bound/migrations/0006_remove_boundbatchmodel_note_boundlistmodel_note_and_more.py
  8. 41 0
      bound/migrations/0007_batchlogmodel_delete_outboundmodel_and_more.py
  9. 36 0
      bound/migrations/0008_batchlogmodel_goods_code_batchlogmodel_goods_qty_and_more.py
  10. 18 0
      bound/migrations/0009_alter_boundbatchmodel_bound_number.py
  11. 18 0
      bound/migrations/0010_alter_boundbatchmodel_bound_number.py
  12. BIN
      bound/migrations/__pycache__/0005_outboundmodel_boundbatchmodel_note.cpython-38.pyc
  13. BIN
      bound/migrations/__pycache__/0006_remove_boundbatchmodel_note_boundlistmodel_note_and_more.cpython-38.pyc
  14. BIN
      bound/migrations/__pycache__/0007_batchlogmodel_delete_outboundmodel_and_more.cpython-38.pyc
  15. BIN
      bound/migrations/__pycache__/0008_batchlogmodel_goods_code_batchlogmodel_goods_qty_and_more.cpython-38.pyc
  16. BIN
      bound/migrations/__pycache__/0009_alter_boundbatchmodel_bound_number.cpython-38.pyc
  17. BIN
      bound/migrations/__pycache__/0010_alter_boundbatchmodel_bound_number.cpython-38.pyc
  18. 33 1
      bound/models.py
  19. 1 0
      bound/serializers.py
  20. 12 7
      bound/views.py
  21. BIN
      db.sqlite3
  22. 0 0
      erp/__init__.py
  23. 3 0
      erp/admin.py
  24. 6 0
      erp/apps.py
  25. 0 0
      erp/migrations/__init__.py
  26. 3 0
      erp/models.py
  27. 3 0
      erp/tests.py
  28. 3 0
      erp/views.py
  29. 212 0
      logs/error.log
  30. 241 0
      logs/server.log
  31. 49 2
      templates/src/layouts/MainLayout.vue
  32. 1 0
      templates/src/pages/inbound/asn.vue
  33. 933 1590
      templates/src/pages/outbound/dn.vue
  34. 18 18
      templates/src/pages/stock/stockbinlist.vue

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


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


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


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


+ 1 - 1
bound/filter.py

@@ -17,7 +17,7 @@ class BoundListFilter(FilterSet):
             'bound_desc' : ['icontains', 'exact'],
             'bound_department': ['exact', 'icontains'],
             'bound_status': ['exact', 'icontains'],
-
+            'base_type': ['exact', 'gt', 'gte', 'lt', 'lte', 'in'],
             'creater': ['icontains', 'exact'],
             'openid': ['exact'],
             'is_delete': ['exact'],

+ 44 - 0
bound/migrations/0005_outboundmodel_boundbatchmodel_note.py

@@ -0,0 +1,44 @@
+# Generated by Django 4.1.2 on 2025-04-23 22:17
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('bound', '0004_boundbatchmodel_goods_unit'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='OutBoundModel',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('bound_month', models.CharField(max_length=255, verbose_name='月份')),
+                ('bound_date', models.DateField(verbose_name='单据日期')),
+                ('bound_code', models.CharField(max_length=255, unique=True, verbose_name='出入库编号')),
+                ('bound_code_type', models.CharField(max_length=255, verbose_name='单据类型')),
+                ('bound_bs_type', models.CharField(max_length=255, verbose_name='业务类型')),
+                ('bound_type', models.CharField(max_length=255, verbose_name='出入库类型')),
+                ('bound_desc', models.CharField(default='', max_length=255, verbose_name='出入库描述')),
+                ('bound_department', models.CharField(max_length=255, verbose_name='部门')),
+                ('bound_status', models.CharField(max_length=255, verbose_name='单据状态')),
+                ('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': 'Out List',
+                'verbose_name_plural': 'Out List',
+                'db_table': 'Outlist',
+                'ordering': ['-id'],
+            },
+        ),
+        migrations.AddField(
+            model_name='boundbatchmodel',
+            name='note',
+            field=models.CharField(default='', max_length=255, verbose_name='备注'),
+        ),
+    ]

+ 27 - 0
bound/migrations/0006_remove_boundbatchmodel_note_boundlistmodel_note_and_more.py

@@ -0,0 +1,27 @@
+# Generated by Django 4.1.2 on 2025-04-23 22:17
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('bound', '0005_outboundmodel_boundbatchmodel_note'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='boundbatchmodel',
+            name='note',
+        ),
+        migrations.AddField(
+            model_name='boundlistmodel',
+            name='note',
+            field=models.CharField(default='', max_length=255, verbose_name='备注'),
+        ),
+        migrations.AddField(
+            model_name='outboundmodel',
+            name='note',
+            field=models.CharField(default='', max_length=255, verbose_name='备注'),
+        ),
+    ]

+ 41 - 0
bound/migrations/0007_batchlogmodel_delete_outboundmodel_and_more.py

@@ -0,0 +1,41 @@
+# Generated by Django 4.1.2 on 2025-04-23 23:14
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('bound', '0006_remove_boundbatchmodel_note_boundlistmodel_note_and_more'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='BatchLogModel',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('log_type', models.CharField(choices=[(0, '入库'), (1, '出库'), (2, '移库'), (9, '其他')], default=9, max_length=255, verbose_name='日志类型')),
+                ('log_content', models.CharField(max_length=255, verbose_name='日志内容')),
+                ('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')),
+                ('batch_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='batch_log', to='bound.boundbatchmodel', verbose_name='批次ID')),
+            ],
+            options={
+                'verbose_name': 'Batch Log',
+                'verbose_name_plural': 'Batch Log',
+                'db_table': 'batchlog',
+            },
+        ),
+        migrations.DeleteModel(
+            name='OutBoundModel',
+        ),
+        migrations.AddField(
+            model_name='boundlistmodel',
+            name='base_type',
+            field=models.IntegerField(default=0, verbose_name='基准类型'),
+        ),
+    ]

+ 36 - 0
bound/migrations/0008_batchlogmodel_goods_code_batchlogmodel_goods_qty_and_more.py

@@ -0,0 +1,36 @@
+# Generated by Django 4.1.2 on 2025-04-24 00:26
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('bound', '0007_batchlogmodel_delete_outboundmodel_and_more'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='batchlogmodel',
+            name='goods_code',
+            field=models.CharField(default=0, max_length=255, verbose_name='商品编码'),
+            preserve_default=False,
+        ),
+        migrations.AddField(
+            model_name='batchlogmodel',
+            name='goods_qty',
+            field=models.BigIntegerField(default=0, verbose_name='商品数量'),
+        ),
+        migrations.AddField(
+            model_name='batchlogmodel',
+            name='log_date',
+            field=models.DateField(default=django.utils.timezone.now, verbose_name='日志日期'),
+            preserve_default=False,
+        ),
+        migrations.AddField(
+            model_name='boundbatchmodel',
+            name='bound_batch_order',
+            field=models.IntegerField(default=0, verbose_name='批次顺序'),
+        ),
+    ]

+ 18 - 0
bound/migrations/0009_alter_boundbatchmodel_bound_number.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.1.2 on 2025-04-24 00:31
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('bound', '0008_batchlogmodel_goods_code_batchlogmodel_goods_qty_and_more'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='boundbatchmodel',
+            name='bound_number',
+            field=models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='入库批次号'),
+        ),
+    ]

+ 18 - 0
bound/migrations/0010_alter_boundbatchmodel_bound_number.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.1.2 on 2025-04-24 00:33
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('bound', '0009_alter_boundbatchmodel_bound_number'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='boundbatchmodel',
+            name='bound_number',
+            field=models.CharField(max_length=255, unique=True, verbose_name='入库批次号'),
+        ),
+    ]

BIN
bound/migrations/__pycache__/0005_outboundmodel_boundbatchmodel_note.cpython-38.pyc


BIN
bound/migrations/__pycache__/0006_remove_boundbatchmodel_note_boundlistmodel_note_and_more.cpython-38.pyc


BIN
bound/migrations/__pycache__/0007_batchlogmodel_delete_outboundmodel_and_more.cpython-38.pyc


BIN
bound/migrations/__pycache__/0008_batchlogmodel_goods_code_batchlogmodel_goods_qty_and_more.cpython-38.pyc


BIN
bound/migrations/__pycache__/0009_alter_boundbatchmodel_bound_number.cpython-38.pyc


BIN
bound/migrations/__pycache__/0010_alter_boundbatchmodel_bound_number.cpython-38.pyc


+ 33 - 1
bound/models.py

@@ -13,7 +13,10 @@ class BoundListModel(models.Model):
     bound_desc = models.CharField(default='', max_length=255, verbose_name="出入库描述")
     bound_department = models.CharField(max_length=255, verbose_name="部门")
 
+    base_type = models.IntegerField(default=0, verbose_name="基准类型")
+
     bound_status = models.CharField(max_length=255, verbose_name="单据状态")
+    note = models.CharField(default='', max_length=255, verbose_name="备注")
 
     creater = models.CharField(default='uesr', max_length=255, verbose_name="Who Created")
     openid = models.CharField(max_length=255, verbose_name="Openid")
@@ -40,8 +43,9 @@ class BoundBatchModel(models.Model):
 
     )
 
-    bound_number = models.CharField(max_length=255, verbose_name="入库批次号")
+    bound_number = models.CharField(max_length=255, verbose_name="入库批次号",blank=False, null=False, unique=True)
     bound_month = models.CharField(max_length=255, verbose_name="月份")
+    bound_batch_order = models.IntegerField(default=0, verbose_name="批次顺序")
   
     warehouse_code = models.CharField(max_length=255, verbose_name="仓库编码")
     warehouse_name = models.CharField(max_length=255, verbose_name="仓库名称")
@@ -58,6 +62,7 @@ class BoundBatchModel(models.Model):
     goods_weight = models.FloatField(default=0, verbose_name="商品单重")
     goods_total_weight = models.FloatField(default=0, verbose_name="商品总重")
 
+
     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')
@@ -70,6 +75,33 @@ class BoundBatchModel(models.Model):
         verbose_name_plural = "Bound Batch"
         ordering = ['-id']
 
+
+class BatchLogModel(models.Model):
+    BATCH_LOG_TYPE = (
+        (0, '入库'),
+        (1, '出库'),
+        (2, '移库'),
+        (9, '其他'),
+        
+    )
+    batch_id  =models.ForeignKey(BoundBatchModel, on_delete=models.CASCADE, verbose_name="批次ID", related_name='batch_log')
+    log_type = models.CharField(choices=BATCH_LOG_TYPE, default=9,max_length=255,verbose_name="日志类型")
+    log_date = models.DateField(verbose_name="日志日期")
+    goods_code = models.CharField(max_length=255, verbose_name="商品编码")
+    goods_qty = models.BigIntegerField(default=0, verbose_name="商品数量")
+    log_content = models.CharField(max_length=255, verbose_name="日志内容")
+    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 = 'batchlog'
+        verbose_name = 'Batch Log'
+        verbose_name_plural = "Batch Log"
+
+
 # 利用创建好的批次来与申请单相对应       
 class BoundDetailModel(models.Model):
     CONTAINER_STATUS = (

+ 1 - 0
bound/serializers.py

@@ -81,6 +81,7 @@ class BoundBatchPostSerializer(serializers.ModelSerializer):
     # 定义批次列表的序列化器,用于创建操作,允许部分字段写入
     bound_number = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
     bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
+    bound_batch_order = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
 
     warehouse_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
     warehouse_name = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])

+ 12 - 7
bound/views.py

@@ -174,13 +174,18 @@ class BoundBatchViewSet(viewsets.ModelViewSet):
         order_day=str(timezone.now().strftime('-%Y%m'))
         order_month=str(timezone.now().strftime('%Y%m'))
         data['bound_month'] =str(timezone.now().strftime('%Y%m'))
-        qs_set = BoundBatchModel.objects.filter( goods_code=data['goods_code'], bound_month=order_month,  is_delete=False)
-        print('qs_set是:', len(qs_set))
-        if len(qs_set) > 0:
-            bound_last_code = qs_set.order_by('-id').first().bound_number
-            data['bound_number'] = data['goods_code'] + '-' + str(int(bound_last_code.split('-')[-1])+1)
-        else:
-            data['bound_number'] = data['goods_code'] + order_day + '01'
+        print(data['order'])
+        if data['order'] == 'true':
+            qs_set = BoundBatchModel.objects.filter( goods_code=data['goods_code'], bound_month=order_month,  is_delete=False)
+            print('qs_set是:', len(qs_set))
+            if len(qs_set) > 0:
+                bound_last_code = qs_set.order_by('-id').first().bound_number
+                data['bound_batch_order'] = int(bound_last_code.split('-')[-1])+1
+                data['bound_number'] = data['goods_code'] + '-' + str(int(bound_last_code.split('-')[-1])+1)
+            else:
+                data['bound_batch_order'] = 1
+                data['bound_number'] = data['goods_code'] + order_day + '01'
+
         serializer = self.get_serializer(data=data)
         serializer.is_valid(raise_exception=True)
         serializer.save()

BIN
db.sqlite3


+ 0 - 0
erp/__init__.py


+ 3 - 0
erp/admin.py

@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.

+ 6 - 0
erp/apps.py

@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class ErpConfig(AppConfig):
+    default_auto_field = 'django.db.models.BigAutoField'
+    name = 'erp'

+ 0 - 0
erp/migrations/__init__.py


+ 3 - 0
erp/models.py

@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.

+ 3 - 0
erp/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 3 - 0
erp/views.py

@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.

+ 212 - 0
logs/error.log

@@ -2679,3 +2679,215 @@ Traceback (most recent call last):
   File "d:\language\python38\lib\site-packages\django\middleware\common.py", line 88, in get_full_path_with_slash
     raise RuntimeError(
 RuntimeError: You called this URL via PUT, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining PUT data. Change your form to point to 127.0.0.1:8008/container/container_wcs/update/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.
+[2025-04-23 23:14:02,175][django.request.log_response():241] [ERROR] Internal Server Error: /bound/list/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+sqlite3.OperationalError: no such column: boundlist.base_type
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\mixins.py", line 40, in list
+    page = self.paginate_queryset(queryset)
+  File "d:\language\python38\lib\site-packages\rest_framework\generics.py", line 171, in paginate_queryset
+    return self.paginator.paginate_queryset(queryset, self.request, view=self)
+  File "d:\language\python38\lib\site-packages\rest_framework\pagination.py", line 216, in paginate_queryset
+    return list(self.page)
+  File "d:\language\python38\lib\site-packages\django\core\paginator.py", line 177, in __len__
+    return len(self.object_list)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 376, in __len__
+    self._fetch_all()
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1866, in _fetch_all
+    self._result_cache = list(self._iterable_class(self))
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 87, in __iter__
+    results = compiler.execute_sql(
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\compiler.py", line 1398, in execute_sql
+    cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 103, in execute
+    return super().execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 67, in execute
+    return self._execute_with_wrappers(
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 80, in _execute_with_wrappers
+    return executor(sql, params, many, context)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\utils.py", line 91, in __exit__
+    raise dj_exc_value.with_traceback(traceback) from exc_value
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+django.db.utils.OperationalError: no such column: boundlist.base_type
+[2025-04-23 23:14:02,419][django.request.log_response():241] [ERROR] Internal Server Error: /bound/list/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+sqlite3.OperationalError: no such column: boundlist.base_type
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\mixins.py", line 40, in list
+    page = self.paginate_queryset(queryset)
+  File "d:\language\python38\lib\site-packages\rest_framework\generics.py", line 171, in paginate_queryset
+    return self.paginator.paginate_queryset(queryset, self.request, view=self)
+  File "d:\language\python38\lib\site-packages\rest_framework\pagination.py", line 216, in paginate_queryset
+    return list(self.page)
+  File "d:\language\python38\lib\site-packages\django\core\paginator.py", line 177, in __len__
+    return len(self.object_list)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 376, in __len__
+    self._fetch_all()
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1866, in _fetch_all
+    self._result_cache = list(self._iterable_class(self))
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 87, in __iter__
+    results = compiler.execute_sql(
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\compiler.py", line 1398, in execute_sql
+    cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 103, in execute
+    return super().execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 67, in execute
+    return self._execute_with_wrappers(
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 80, in _execute_with_wrappers
+    return executor(sql, params, many, context)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\utils.py", line 91, in __exit__
+    raise dj_exc_value.with_traceback(traceback) from exc_value
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+django.db.utils.OperationalError: no such column: boundlist.base_type
+[2025-04-24 00:33:58,801][django.request.log_response():241] [ERROR] Internal Server Error: /bound/batch/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+sqlite3.IntegrityError: UNIQUE constraint failed: boundbatch.bound_number
+
+The above exception was the direct cause of the following exception:
+
+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\.\bound\views.py", line 191, in create
+    serializer.save()
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 212, in save
+    self.instance = self.create(validated_data)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 962, in create
+    instance = ModelClass._default_manager.create(**validated_data)
+  File "d:\language\python38\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
+    return getattr(self.get_queryset(), name)(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 671, in create
+    obj.save(force_insert=True, using=self.db)
+  File "d:\language\python38\lib\site-packages\django\db\models\base.py", line 812, in save
+    self.save_base(
+  File "d:\language\python38\lib\site-packages\django\db\models\base.py", line 863, in save_base
+    updated = self._save_table(
+  File "d:\language\python38\lib\site-packages\django\db\models\base.py", line 1006, in _save_table
+    results = self._do_insert(
+  File "d:\language\python38\lib\site-packages\django\db\models\base.py", line 1047, in _do_insert
+    return manager._insert(
+  File "d:\language\python38\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
+    return getattr(self.get_queryset(), name)(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1790, in _insert
+    return query.get_compiler(using=using).execute_sql(returning_fields)
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\compiler.py", line 1660, in execute_sql
+    cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 103, in execute
+    return super().execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 67, in execute
+    return self._execute_with_wrappers(
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 80, in _execute_with_wrappers
+    return executor(sql, params, many, context)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\utils.py", line 91, in __exit__
+    raise dj_exc_value.with_traceback(traceback) from exc_value
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+django.db.utils.IntegrityError: UNIQUE constraint failed: boundbatch.bound_number

+ 241 - 0
logs/server.log

@@ -4784,3 +4784,244 @@ RuntimeError: You called this URL via PUT, but the URL doesn't end in a slash an
 [2025-04-22 17:22:44,101][django.request.log_response():241] [WARNING] Bad Request: /container/container_wcs/update/
 [2025-04-22 17:24:11,542][django.request.log_response():241] [WARNING] Bad Request: /container/container_wcs/update/
 [2025-04-22 17:24:51,457][django.request.log_response():241] [WARNING] Bad Request: /container/container_wcs/update/
+[2025-04-23 09:16:13,622][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-23 09:31:33,249][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-23 10:01:50,118][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-23 15:28:11,291][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-23 15:28:14,805][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-23 15:28:16,530][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-23 15:33:01,200][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-23 20:23:47,136][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-23 22:10:08,499][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-23 22:19:00,764][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-23 22:19:03,963][django.request.log_response():241] [WARNING] Not Found: /dn/detail/
+[2025-04-23 22:19:04,587][django.request.log_response():241] [WARNING] Not Found: /dn/detail/
+[2025-04-23 22:19:04,968][django.request.log_response():241] [WARNING] Not Found: /dn/detail/
+[2025-04-23 22:19:05,947][django.request.log_response():241] [WARNING] Not Found: /dn/detail/
+[2025-04-23 22:19:07,301][django.request.log_response():241] [WARNING] Not Found: /dn/detail/
+[2025-04-23 22:19:08,926][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-23 22:19:13,103][django.request.log_response():241] [WARNING] Not Found: /dn/detail/
+[2025-04-23 22:19:16,547][django.request.log_response():241] [WARNING] Not Found: /dn/detail/
+[2025-04-23 22:19:17,050][django.request.log_response():241] [WARNING] Not Found: /dn/detail/
+[2025-04-23 22:19:17,465][django.request.log_response():241] [WARNING] Not Found: /dn/detail/
+[2025-04-23 22:19:17,832][django.request.log_response():241] [WARNING] Not Found: /dn/detail/
+[2025-04-23 22:19:19,294][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-23 22:19:20,798][django.request.log_response():241] [WARNING] Not Found: /dn/orderrelease/
+[2025-04-23 22:20:34,559][django.request.log_response():241] [WARNING] Not Found: /dn/list/
+[2025-04-23 22:32:30,929][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-23 22:33:56,696][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-23 22:39:27,544][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-23 23:14:02,175][django.request.log_response():241] [ERROR] Internal Server Error: /bound/list/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+sqlite3.OperationalError: no such column: boundlist.base_type
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\mixins.py", line 40, in list
+    page = self.paginate_queryset(queryset)
+  File "d:\language\python38\lib\site-packages\rest_framework\generics.py", line 171, in paginate_queryset
+    return self.paginator.paginate_queryset(queryset, self.request, view=self)
+  File "d:\language\python38\lib\site-packages\rest_framework\pagination.py", line 216, in paginate_queryset
+    return list(self.page)
+  File "d:\language\python38\lib\site-packages\django\core\paginator.py", line 177, in __len__
+    return len(self.object_list)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 376, in __len__
+    self._fetch_all()
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1866, in _fetch_all
+    self._result_cache = list(self._iterable_class(self))
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 87, in __iter__
+    results = compiler.execute_sql(
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\compiler.py", line 1398, in execute_sql
+    cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 103, in execute
+    return super().execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 67, in execute
+    return self._execute_with_wrappers(
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 80, in _execute_with_wrappers
+    return executor(sql, params, many, context)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\utils.py", line 91, in __exit__
+    raise dj_exc_value.with_traceback(traceback) from exc_value
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+django.db.utils.OperationalError: no such column: boundlist.base_type
+[2025-04-23 23:14:02,419][django.request.log_response():241] [ERROR] Internal Server Error: /bound/list/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+sqlite3.OperationalError: no such column: boundlist.base_type
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\mixins.py", line 40, in list
+    page = self.paginate_queryset(queryset)
+  File "d:\language\python38\lib\site-packages\rest_framework\generics.py", line 171, in paginate_queryset
+    return self.paginator.paginate_queryset(queryset, self.request, view=self)
+  File "d:\language\python38\lib\site-packages\rest_framework\pagination.py", line 216, in paginate_queryset
+    return list(self.page)
+  File "d:\language\python38\lib\site-packages\django\core\paginator.py", line 177, in __len__
+    return len(self.object_list)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 376, in __len__
+    self._fetch_all()
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1866, in _fetch_all
+    self._result_cache = list(self._iterable_class(self))
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 87, in __iter__
+    results = compiler.execute_sql(
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\compiler.py", line 1398, in execute_sql
+    cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 103, in execute
+    return super().execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 67, in execute
+    return self._execute_with_wrappers(
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 80, in _execute_with_wrappers
+    return executor(sql, params, many, context)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\utils.py", line 91, in __exit__
+    raise dj_exc_value.with_traceback(traceback) from exc_value
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+django.db.utils.OperationalError: no such column: boundlist.base_type
+[2025-04-23 23:55:41,197][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-23 23:59:06,605][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-04-24 00:33:58,801][django.request.log_response():241] [ERROR] Internal Server Error: /bound/batch/
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+sqlite3.IntegrityError: UNIQUE constraint failed: boundbatch.bound_number
+
+The above exception was the direct cause of the following exception:
+
+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\.\bound\views.py", line 191, in create
+    serializer.save()
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 212, in save
+    self.instance = self.create(validated_data)
+  File "d:\language\python38\lib\site-packages\rest_framework\serializers.py", line 962, in create
+    instance = ModelClass._default_manager.create(**validated_data)
+  File "d:\language\python38\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
+    return getattr(self.get_queryset(), name)(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 671, in create
+    obj.save(force_insert=True, using=self.db)
+  File "d:\language\python38\lib\site-packages\django\db\models\base.py", line 812, in save
+    self.save_base(
+  File "d:\language\python38\lib\site-packages\django\db\models\base.py", line 863, in save_base
+    updated = self._save_table(
+  File "d:\language\python38\lib\site-packages\django\db\models\base.py", line 1006, in _save_table
+    results = self._do_insert(
+  File "d:\language\python38\lib\site-packages\django\db\models\base.py", line 1047, in _do_insert
+    return manager._insert(
+  File "d:\language\python38\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
+    return getattr(self.get_queryset(), name)(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\db\models\query.py", line 1790, in _insert
+    return query.get_compiler(using=using).execute_sql(returning_fields)
+  File "d:\language\python38\lib\site-packages\django\db\models\sql\compiler.py", line 1660, in execute_sql
+    cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 103, in execute
+    return super().execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 67, in execute
+    return self._execute_with_wrappers(
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 80, in _execute_with_wrappers
+    return executor(sql, params, many, context)
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\utils.py", line 91, in __exit__
+    raise dj_exc_value.with_traceback(traceback) from exc_value
+  File "d:\language\python38\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
+    return self.cursor.execute(sql, params)
+  File "d:\language\python38\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
+    return Database.Cursor.execute(self, query, params)
+django.db.utils.IntegrityError: UNIQUE constraint failed: boundbatch.bound_number

+ 49 - 2
templates/src/layouts/MainLayout.vue

@@ -114,8 +114,21 @@
           <q-item clickable :to="{ name: 'dn' }" @click="linkChange('outbound')" v-ripple exact
             :active="link === 'outbound' && link !== ''"
             :class="{ 'my-menu-link': link === 'outbound' && link !== '' }">
-            <q-item-section avatar><q-icon name="rv_hookup" /></q-item-section>
+            <q-item-section avatar>
+              <q-icon name="rv_hookup">
+
+              </q-icon>
+            </q-item-section>
             <q-item-section>{{ $t("menuItem.outbound") }}</q-item-section>
+
+            <q-badge 
+              v-if="pendingTasks > 0"
+              color="red-5"
+              class="task-badge"
+              :class="{ 'high-priority': pendingTasks > 20 }"
+            >
+              {{ pendingTasks > 99 ? '99+' : pendingTasks }}
+            </q-badge>
           </q-item>
 
 
@@ -341,7 +354,9 @@ export default {
         password2: ''
       },
       needLogin: '',
-      activeTab: ''
+      activeTab: '',
+      pendingTasks: 5,
+      pollInterval: null
     }
   },
   methods: {
@@ -650,4 +665,36 @@ export default {
 .tabs .absolute-bottom {
   bottom: 8px;
 }
+
+/* 基础定位 */
+.menu-item-with-badge {
+  position: relative;
+}
+
+.task-badge {
+  /* 定位 */
+  position: absolute;
+  top: 12px;
+  right: 12px;
+  transform: translate(50%, -50%);
+  
+  /* 样式 */
+  min-width: 20px;
+  height: 20px;
+  font-size: 0.75rem;
+  font-weight: 700;
+  border-radius: 2px;
+  padding: 2px 6px;
+  box-shadow: 0 2px 4px rgba(0,0,0,0.15);
+  
+  /* 动画 */
+  transition: all 0.3s ease;
+  animation: pulse 2s infinite;
+}
+
+/* 高优先级样式 */
+.task-badge.high-priority {
+  color: white !important;
+  background: linear-gradient(145deg, #ff5252, #ff1744);
+}
 </style>

+ 1 - 0
templates/src/pages/inbound/asn.vue

@@ -535,6 +535,7 @@ export default {
       // 合并基础参数
       const baseParams = {
         page: _this.current,
+        base_type: '0',
         page_size: _this.pagination.rowsPerPage
       }
 

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 933 - 1590
templates/src/pages/outbound/dn.vue


+ 18 - 18
templates/src/pages/stock/stockbinlist.vue

@@ -14,7 +14,23 @@
           </q-btn-group>
           <q-space />
           <!-- <div class="q-pa-md"> -->
-            
+            <div v-show="max !== 0"class="slider-container">
+              <div class="buttons-wrapper">
+                <div 
+                  v-for="(type, index) in bin_type"
+                  :key="type"
+                  class="slider-button"
+                  :class="{ 'active': current_bin_type === type }"
+                  @click="handleSwitch(type, index)"
+                >
+                  {{ bin_type_name[index] }}
+                </div>
+                <div 
+                  class="slider-track"
+                  :style="sliderStyle"
+                ></div>
+              </div>
+          </div>
       
 
           <q-space />
@@ -51,23 +67,7 @@
     </transition>
     <template>
       <div v-show="max !== 0" class="q-pa-lg flex flex-center">
-        <div class="slider-container">
-              <div class="buttons-wrapper">
-                <div 
-                  v-for="(type, index) in bin_type"
-                  :key="type"
-                  class="slider-button"
-                  :class="{ 'active': current_bin_type === type }"
-                  @click="handleSwitch(type, index)"
-                >
-                  {{ bin_type_name[index] }}
-                </div>
-                <div 
-                  class="slider-track"
-                  :style="sliderStyle"
-                ></div>
-              </div>
-          </div>
+
         <div>{{ total }} </div>
         <q-pagination v-model="current" color="black" :max="max" :max-pages="6" boundary-links
           @click="getSearchList(current); paginationIpt = current" />