Browse Source

erp审核

flower_mr 4 tuần trước cách đây
mục cha
commit
8ea062f9a4
26 tập tin đã thay đổi với 3865 bổ sung111 xóa
  1. BIN
      db.sqlite3
  2. BIN
      erp/__pycache__/models.cpython-38.pyc
  3. BIN
      erp/__pycache__/serializers.cpython-38.pyc
  4. BIN
      erp/__pycache__/urls.cpython-38.pyc
  5. BIN
      erp/__pycache__/views.cpython-38.pyc
  6. 30 0
      erp/migrations/0016_inboundbilloperatelog.py
  7. 19 0
      erp/migrations/0017_alter_inboundbilloperatelog_billid.py
  8. 35 0
      erp/migrations/0018_alter_inboundbill_type_outboundbilloperatelog.py
  9. 18 0
      erp/migrations/0019_alter_inboundbilloperatelog_log_type.py
  10. 18 0
      erp/migrations/0020_alter_inboundbilloperatelog_log_type.py
  11. 23 0
      erp/migrations/0021_alter_inboundbill_bound_status_and_more.py
  12. BIN
      erp/migrations/__pycache__/0016_inboundbilloperatelog.cpython-38.pyc
  13. BIN
      erp/migrations/__pycache__/0017_alter_inboundbilloperatelog_billid.cpython-38.pyc
  14. BIN
      erp/migrations/__pycache__/0018_alter_inboundbill_type_outboundbilloperatelog.cpython-38.pyc
  15. BIN
      erp/migrations/__pycache__/0019_alter_inboundbilloperatelog_log_type.cpython-38.pyc
  16. BIN
      erp/migrations/__pycache__/0020_alter_inboundbilloperatelog_log_type.cpython-38.pyc
  17. BIN
      erp/migrations/__pycache__/0021_alter_inboundbill_bound_status_and_more.cpython-38.pyc
  18. 64 7
      erp/models.py
  19. 22 2
      erp/serializers.py
  20. 10 0
      erp/urls.py
  21. 292 42
      erp/views.py
  22. 65 0
      logs/boundBill.log
  23. 611 0
      logs/error.log
  24. 2512 0
      logs/server.log
  25. 145 59
      templates/src/pages/erp/erpasn.vue
  26. 1 1
      templates/src/pages/inbound/asn.vue

BIN
db.sqlite3


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


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


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


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


+ 30 - 0
erp/migrations/0016_inboundbilloperatelog.py

@@ -0,0 +1,30 @@
+# Generated by Django 4.1.2 on 2025-05-09 15:21
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('erp', '0015_alter_inboundbill_department_and_more'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='InboundBillOperateLog',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('log_type', models.CharField(max_length=20, verbose_name='操作类型')),
+                ('log_content', models.TextField(verbose_name='操作内容')),
+                ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
+                ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
+                ('billId', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sourced_bill_id', to='erp.inboundbill', verbose_name='所属入库单')),
+            ],
+            options={
+                'verbose_name': '入库单日志',
+                'verbose_name_plural': '入库单日志',
+                'ordering': ['-update_time', '-create_time'],
+            },
+        ),
+    ]

+ 19 - 0
erp/migrations/0017_alter_inboundbilloperatelog_billid.py

@@ -0,0 +1,19 @@
+# Generated by Django 4.1.2 on 2025-05-09 15:22
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('erp', '0016_inboundbilloperatelog'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='inboundbilloperatelog',
+            name='billId',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_id_log', to='erp.inboundbill', verbose_name='所属入库单'),
+        ),
+    ]

+ 35 - 0
erp/migrations/0018_alter_inboundbill_type_outboundbilloperatelog.py

@@ -0,0 +1,35 @@
+# Generated by Django 4.1.2 on 2025-05-09 15:29
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('erp', '0017_alter_inboundbilloperatelog_billid'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='inboundbill',
+            name='type',
+            field=models.IntegerField(choices=[(1, '生产入库'), (2, '采购入库'), (3, '其他入库'), (4, '调拨入库')], verbose_name='绑定类型'),
+        ),
+        migrations.CreateModel(
+            name='OutboundBillOperateLog',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('log_type', models.CharField(max_length=20, verbose_name='操作类型')),
+                ('log_content', models.TextField(verbose_name='操作内容')),
+                ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
+                ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
+                ('billId', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_id_log', to='erp.outboundbill', verbose_name='所属出库单')),
+            ],
+            options={
+                'verbose_name': '出库单日志',
+                'verbose_name_plural': '出库单日志',
+                'ordering': ['-update_time', '-create_time'],
+            },
+        ),
+    ]

+ 18 - 0
erp/migrations/0019_alter_inboundbilloperatelog_log_type.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.1.2 on 2025-05-09 15:35
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('erp', '0018_alter_inboundbill_type_outboundbilloperatelog'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='inboundbilloperatelog',
+            name='log_type',
+            field=models.CharField(choices=[('create', '创建'), ('update', '更新'), ('delete', '删除'), ('audit', '审核'), ('update_batch', '质检'), ('cancel', '取消'), ('submit', '提交'), ('confirm', '确认'), ('reject', '驳回'), ('confirm_submit', '确认提交'), ('confirm_audit', '确认审核'), ('confirm_cancel', '确认取消')], max_length=20, verbose_name='操作类型'),
+        ),
+    ]

+ 18 - 0
erp/migrations/0020_alter_inboundbilloperatelog_log_type.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.1.2 on 2025-05-09 16:10
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('erp', '0019_alter_inboundbilloperatelog_log_type'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='inboundbilloperatelog',
+            name='log_type',
+            field=models.CharField(choices=[('create', '创建'), ('update', '更新'), ('erp_audit', 'erp审核'), ('wms_audit', 'wms审核'), ('update_batch', 'erp质检'), ('delete', '删除'), ('cancel', '取消'), ('submit', '提交'), ('confirm', '确认'), ('reject', '驳回'), ('confirm_submit', '确认提交'), ('confirm_audit', '确认审核'), ('confirm_cancel', '确认取消')], max_length=20, verbose_name='操作类型'),
+        ),
+    ]

+ 23 - 0
erp/migrations/0021_alter_inboundbill_bound_status_and_more.py

@@ -0,0 +1,23 @@
+# Generated by Django 4.1.2 on 2025-05-10 00:43
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('erp', '0020_alter_inboundbilloperatelog_log_type'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='inboundbill',
+            name='bound_status',
+            field=models.IntegerField(choices=[(0, '草稿'), (1, '汇报'), (2, '审核'), (3, '部分入库'), (4, '全部入库'), (404, '取消')], default=0, verbose_name='状态'),
+        ),
+        migrations.AlterField(
+            model_name='outboundbill',
+            name='bound_status',
+            field=models.IntegerField(choices=[(0, '草稿'), (1, '已审批'), (2, '已入库'), (3, '已取消')], default=0, verbose_name='状态'),
+        ),
+    ]

BIN
erp/migrations/__pycache__/0016_inboundbilloperatelog.cpython-38.pyc


BIN
erp/migrations/__pycache__/0017_alter_inboundbilloperatelog_billid.cpython-38.pyc


BIN
erp/migrations/__pycache__/0018_alter_inboundbill_type_outboundbilloperatelog.cpython-38.pyc


BIN
erp/migrations/__pycache__/0019_alter_inboundbilloperatelog_log_type.cpython-38.pyc


BIN
erp/migrations/__pycache__/0020_alter_inboundbilloperatelog_log_type.cpython-38.pyc


BIN
erp/migrations/__pycache__/0021_alter_inboundbill_bound_status_and_more.cpython-38.pyc


+ 64 - 7
erp/models.py

@@ -2,14 +2,18 @@ from django.db import models
 
 class InboundBill(models.Model):
     BOUND_TYPE = (
-        (1, '订单'),
-        (2, '其他'),
+        (1, '生产入库'),
+        (2, '采购入库'),
+        (3, '其他入库'),
+        (4, '调拨入库'),
     )
     STATUS_CHOICES = (
         (0, '草稿'),
-        (1, '已审批'),
-        (2, '已入库'),
-        (3, '已取消'),
+        (1, '汇报'),
+        (2, '审核'),
+        (3, '部分入库'),
+        (4, '全部入库'),
+        (404, '取消'),
     )
     billId = models.BigIntegerField(primary_key=True,verbose_name='原始单据ID')
     number = models.CharField(max_length=50, unique=True, verbose_name='单据编号')
@@ -22,7 +26,7 @@ class InboundBill(models.Model):
     totalCount = models.IntegerField(verbose_name='总条目数')
     create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
     update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
-    bound_status = models.IntegerField(default=0, verbose_name='状态')
+    bound_status = models.IntegerField(default=0,choices=STATUS_CHOICES, verbose_name='状态')
     is_delete = models.BooleanField(default=False, verbose_name='是否删除')
     erp_audit_id = models.CharField(max_length=1000,null=True, verbose_name='ERP审核ID')  
     erp_save_id = models.CharField(max_length=1000,null=True, verbose_name='ERP保存ID')  
@@ -31,6 +35,42 @@ class InboundBill(models.Model):
         verbose_name_plural = verbose_name
         ordering = [ 'bound_status','-create_time','-update_time']
     
+class InboundBillOperateLog(models.Model):
+    """入库单日志"""
+    log_type_choices = (
+        ('create', '创建'),
+        ('update', '更新'),
+
+        ('erp_audit', 'erp审核'),
+        ('wms_audit', 'wms审核'),
+
+        ('update_batch', 'erp质检'),
+
+        ('delete', '删除'),
+        ('cancel', '取消'),
+        ('submit', '提交'),
+        ('confirm', '确认'),
+        ('reject', '驳回'),
+        ('confirm_submit', '确认提交'),
+        ('confirm_audit', '确认审核'),
+        ('confirm_cancel', '确认取消'),
+    )
+    billId = models.ForeignKey(
+        InboundBill,
+        on_delete=models.CASCADE,
+        related_name='bill_id_log',
+        verbose_name='所属入库单'
+    )
+    log_type = models.CharField(max_length=20,choices=log_type_choices, verbose_name='操作类型')
+    log_content = models.TextField(verbose_name='操作内容')
+    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
+    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
+
+    class Meta:
+        verbose_name = '入库单日志'
+        verbose_name_plural = verbose_name
+        ordering = ['-update_time', '-create_time']
+
 class OutboundBill(models.Model):
 
     BOUND_TYPE = (
@@ -55,7 +95,7 @@ class OutboundBill(models.Model):
     totalCount = models.IntegerField(verbose_name='总条目数')
     create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
     update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
-    bound_status = models.IntegerField(default=0, verbose_name='状态')
+    bound_status = models.IntegerField(default=0, choices=STATUS_CHOICES,verbose_name='状态')
     is_delete = models.BooleanField(default=False, verbose_name='是否删除')
     erp_audit_id = models.CharField(max_length=1000,null=True, verbose_name='ERP审核ID')  
     erp_save_id = models.CharField(max_length=1000,null=True, verbose_name='ERP保存ID')  
@@ -65,6 +105,23 @@ class OutboundBill(models.Model):
         verbose_name_plural = verbose_name
         ordering = [ 'bound_status','-create_time','-update_time']
 
+class OutboundBillOperateLog(models.Model):
+    """出库单日志"""
+    billId = models.ForeignKey(
+        OutboundBill,
+        on_delete=models.CASCADE,
+        related_name='bill_id_log',
+        verbose_name='所属出库单'
+    )
+    log_type = models.CharField(max_length=20, verbose_name='操作类型')
+    log_content = models.TextField(verbose_name='操作内容')
+    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
+    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
+
+    class Meta:
+        verbose_name = '出库单日志'
+        verbose_name_plural = verbose_name
+        ordering = ['-update_time', '-create_time']
 
 
 class MaterialDetail(models.Model):

+ 22 - 2
erp/serializers.py

@@ -1,5 +1,5 @@
 from rest_framework import serializers
-from .models import InboundBill, MaterialDetail ,OutboundBill, OutMaterialDetail
+from .models import InboundBill, MaterialDetail ,OutboundBill, OutMaterialDetail, InboundBillOperateLog, OutboundBillOperateLog
 from utils import datasolve
 
 class InboundApplySerializer(serializers.ModelSerializer):
@@ -84,7 +84,6 @@ class boundPostSerializer(serializers.Serializer):
         
         return value
     
-
 class MaterialDetailSerializer(serializers.ModelSerializer):
     """
     物料明细序列化器
@@ -161,3 +160,24 @@ class outboundPostSerializer(serializers.Serializer):
         
         return value
     
+class InboundbillOperateLogSerializer(serializers.ModelSerializer):
+    """
+    入库单操作日志序列化器
+    """
+    create_time = serializers.DateTimeField(format='%Y-%m-%d', required=False, label='操作时间')
+    class Meta:
+        model = InboundBillOperateLog
+        fields = '__all__'
+        ordering_fields = ['update_time', 'create_time']
+        read_only_fields = ['billId', 'operate_type', 'operate_content', 'operate_time']
+
+class OutboundbillOperateLogSerializer(serializers.ModelSerializer):
+    """
+    出库单操作日志序列化器
+    """
+    create_time = serializers.DateTimeField(format='%Y-%m-%d', required=False, label='操作时间')
+    class Meta:
+        model = OutboundBillOperateLog
+        fields = '__all__'
+        ordering_fields = ['update_time', 'create_time']
+        read_only_fields = ['billId', 'operate_type', 'operate_content', 'operate_time']

+ 10 - 0
erp/urls.py

@@ -10,6 +10,16 @@ urlpatterns = [
     path('generateinbound', views.GenerateInbound.as_view()),
     path('generateoutbound', views.GenerateOutbound.as_view()),
 
+    path('inboundBills/log/', views.InboundBillsLog.as_view({"get": "list"}),name="inboundBillslog"),
+    path('outboundBills/log/', views.OutboundBillsLog.as_view({"get": "list"}),name="outboundBillslog"),
+    path('inboundBills/number/', views.InboundBills.as_view({"post": "get_bound_number"}),name="inboundBillsnumber"),
+
+    # path('inboundBills/audit/', views.bound_apply.as_view(), name="inboundBills-audit"),
+    # path('inboundBills/save/', views.bound_apply.as_view(), name="inboundBills-save"),
+    path('boundBills/<str:action_type>/', views.bound_apply.as_view(), name="inboundBills-action"),
+
+
+
     path('inboundBills/', views.InboundBills.as_view({"get": "list"}),name="inboundBills"),
     re_path(r'^inboundBills/(?P<pk>\d+)/$', views.InboundBills.as_view({
         'get': 'retrieve'

+ 292 - 42
erp/views.py

@@ -24,7 +24,7 @@ from django.db import transaction
 from bound.models import BoundListModel, BoundBatchModel, OutBatchModel,BoundDetailModel,OutBoundDetailModel,BatchLogModel
 from warehouse.models import ProductListModel
 from rest_framework.response import Response
-
+import json
 
 logger = logging.getLogger('wms.boundBill')
 
@@ -221,6 +221,12 @@ class InboundApplyCreate(APIView):
             bound_bill.erp_save_id = bound_bill.billId
             bound_bill.update_time = timezone.now()
             bound_bill.save()
+
+            InboundBillOperateLog.objects.create(
+                billId=bound_bill,
+                log_type ='update',
+                log_content = f"更新入库单{bound_bill.number}信息",
+            )
         except InboundBill.DoesNotExist:
             bound_bill = InboundBill.objects.create(
                 billId=serializer.validated_data['billId'],
@@ -240,6 +246,11 @@ class InboundApplyCreate(APIView):
             if bound_bill.type != 1:
                 bound_bill.erp_audit_id = bound_bill.number
             bound_bill.save()
+            InboundBillOperateLog.objects.create(
+                billId=bound_bill,
+                log_type ='create',
+                log_content = f"创建入库单{bound_bill.number}信息",
+            )
         return bound_bill
 
     def save_or_update_material_detail(self, bound_bill, serializer):
@@ -444,7 +455,23 @@ class GenerateInbound(APIView):
         """创建出入库主单(带来源标识)"""
         if BoundListModel.objects.filter(relate_bill=bill_obj).exists():
             return BoundListModel.objects.get(relate_bill=bill_obj)
-
+        if bill_obj.type == 1:
+            bound_desc = f"生产入库单{bill_obj.number}"
+        elif bill_obj.type == 2:
+            bound_desc = f"采购入库单{bill_obj.number}"
+        elif bill_obj.type == 4:
+            bound_desc = f"调拨入库单{bill_obj.number}"
+        else:   
+            bound_desc = f"其他入库单{bill_obj.number}"
+
+        InboundBillOperateLog.objects.create(
+            billId=bill_obj,
+            log_type ='wms_audit',
+            log_content = f"WMS创建入库单{bill_obj.number}信息,开始执行入库任务",
+        )
+        # 更新原始单据状态
+        bill_obj.status = 2
+        bill_obj.save()   
         return BoundListModel.objects.create(
             bound_month=timezone.now().strftime("%Y%m"),
             bound_date=timezone.now().strftime("%Y-%m-%d"),
@@ -453,7 +480,7 @@ class GenerateInbound(APIView):
             bound_code_type=bill_obj.type,
             bound_bs_type='B01',
             bound_type='in',
-            bound_desc=f"生产入库单{bill_obj.number}",
+            bound_desc=bound_desc,
             bound_department=(bill_obj.department if bill_obj.department else 'D99'),
             base_type=0,
             bound_status='101',
@@ -643,6 +670,20 @@ class GenerateOutbound(APIView):
         """创建出入库主单(带来源标识)"""
         if BoundListModel.objects.filter(relate_out_bill=bill_obj).exists():
             return BoundListModel.objects.get(relate_out_bill=bill_obj)
+        if bill_obj.type == 1:
+            bound_desc = f"销售出库单{bill_obj.number}"
+        elif bill_obj.type == 2:
+            bound_desc = f"生产领料单{bill_obj.number}"
+        else:   
+            bound_desc = f"其他出库单{bill_obj.number}"
+        OutboundBillOperateLog.objects.create(
+            billId=bill_obj,
+            log_type ='wms_audit',
+            log_content = f"WMS创建出库单{bill_obj.number}信息,开始执行出库任务",
+        )
+        # 更新原始单据状态
+        bill_obj.status = 2
+        bill_obj.save()   
 
         return BoundListModel.objects.create(
             bound_month=timezone.now().strftime("%Y%m"),
@@ -652,7 +693,7 @@ class GenerateOutbound(APIView):
             bound_code_type=bill_obj.type,
             bound_bs_type='B01',
             bound_type='out',
-            bound_desc=f"生产出库单{bill_obj.number}",
+            bound_desc=bound_desc,
             bound_department=(bill_obj.department if bill_obj.department else 'D99'),
             base_type=1,
             bound_status='201',
@@ -711,8 +752,8 @@ class OutboundApplyCreate(APIView):
                         "errors": error_details
                     }]
                 )
-            # 保存或更新库单
-            bound_bill = self.save_or_update_inbound_bill(serializer)
+            # 保存或更新库单
+            bound_bill = self.save_or_update_outbound_bill(serializer)
 
             # 保存或更新物料明细
             self.save_or_update_material_detail(bound_bill, serializer)
@@ -795,7 +836,7 @@ class OutboundApplyCreate(APIView):
             return False,error_details
         return True,None
         
-    def save_or_update_inbound_bill(self, serializer):
+    def save_or_update_outbound_bill(self, serializer):
         """保存或更新出库单"""
         try:
             bound_bill = OutboundBill.objects.get(billId=serializer.validated_data['billId'])
@@ -813,6 +854,13 @@ class OutboundApplyCreate(APIView):
 
             bound_bill.update_time = timezone.now()
             bound_bill.save()
+            OutboundBillOperateLog.objects.create(
+                billId=bound_bill,
+                log_type ='update',
+                log_content = f"ERP更新出库单{bound_bill.number}信息",
+            )
+
+
         except OutboundBill.DoesNotExist:
             bound_bill = OutboundBill.objects.create(
                 billId=serializer.validated_data['billId'],
@@ -829,6 +877,11 @@ class OutboundApplyCreate(APIView):
                 create_time=timezone.now(),
                 update_time=timezone.now()
             )
+            OutboundBillOperateLog.objects.create(
+                billId=bound_bill,
+                log_type ='create',
+                log_content = f"ERP创建出库单{bound_bill.number}信息",
+            )
         return bound_bill
 
     def save_or_update_material_detail(self, bound_bill, serializer):
@@ -1006,6 +1059,12 @@ class BatchUpdate(APIView):
                                 })
                                 fail_count += 1
                                 continue
+                            if instance.status == 0:
+                                InboundBillOperateLog.objects.create(
+                                billId=bill_obj,
+                                log_type ='update_batch',
+                                log_content = f"物料明细{instance.goods_name},质检通过",
+                                )
                             instance.status = 1
                          
                             bill_obj = InboundBill.objects.get(billId=material_billId)
@@ -1019,7 +1078,9 @@ class BatchUpdate(APIView):
                                 continue
                             bill_obj.erp_audit_id = material_audit_id
                             logger.info("[1]入库单号%s,物料明细%s,更新状态,审核通过%s",bill_obj.number,material_entryId,material_audit_id)   
-                            logger.info("[2]入库单号%s,物料明细%s,更新状态,审核通过%s",bill_obj.number,material_entryId,bill_obj.erp_audit_id)   
+                            logger.info("[2]入库单号%s,物料明细%s,更新状态,审核通过%s",bill_obj.number,material_entryId,bill_obj.erp_audit_id) 
+                            
+
                             instance.save()
                             bill_obj.save()
                             success_count += 1
@@ -1178,9 +1239,8 @@ class ERPSyncBase:
                     timeout=10
                 )
                 response.raise_for_status()
-                
-                erp_id = self.process_erp_response(response.json())
-                return True
+
+                return self.process_erp_response(response.json())
             except requests.exceptions.HTTPError as http_err:
                 if response.status_code == 519:
                     print("特定HTTP错误 519:", http_err)
@@ -1225,10 +1285,8 @@ class ProductionInboundAuditSync(ERPSyncBase):
     # 处理响应
 
     def process_erp_response(self, response):
-        print("ERP审核响应:",response)
-        if response['status'] != True:
-            raise ValueError(f"ERP审核失败: {response['message']}")
-        return response['data']
+        logger.info("ERP审核响应:",response)
+        return response['status']
 """采购收料入库审核"""      
 class PurchaseInboundAuditSync(ERPSyncBase):
     
@@ -1256,10 +1314,8 @@ class PurchaseInboundAuditSync(ERPSyncBase):
     # 处理响应
 
     def process_erp_response(self, response):
-        print("ERP审核响应:",response)
-        if response['status'] != True:
-            raise ValueError(f"ERP审核失败: {response['message']}")
-        return response['data']
+        logger.info("ERP审核响应:",response)
+        return response['status']
 """其他入库审核"""
 class OtherInboundAuditSync(ERPSyncBase):
     
@@ -1287,10 +1343,8 @@ class OtherInboundAuditSync(ERPSyncBase):
     # 处理响应
 
     def process_erp_response(self, response):
-        print("ERP审核响应:",response)
-        if response['status'] != True:
-            raise ValueError(f"ERP审核失败: {response['message']}")
-        return response['data']
+        logger.info("ERP审核响应:",response)
+        return response['status']
 """调拨入库审核"""
 class TransferInboundAuditSync(ERPSyncBase):
     
@@ -1319,10 +1373,8 @@ class TransferInboundAuditSync(ERPSyncBase):
     # 处理响应
 
     def process_erp_response(self, response):
-        print("ERP审核响应:",response)
-        if response['status'] != True:
-            raise ValueError(f"ERP审核失败: {response['message']}")
-        return response['data']
+        logger.info("ERP审核响应:",response)
+        return response['status']
 """其他出库审核"""
 class OtherOutboundAuditSync(ERPSyncBase):
     
@@ -1350,10 +1402,8 @@ class OtherOutboundAuditSync(ERPSyncBase):
     # 处理响应
 
     def process_erp_response(self, response):
-        print("ERP审核响应:",response)
-        if response['status'] != True:
-            raise ValueError(f"ERP审核失败: {response['message']}")
-        return response['data']
+        logger.info("ERP审核响应:",response)
+        return response['status']
 """生产领料出库审核"""
 class ProductionOutboundAuditSync(ERPSyncBase):
     
@@ -1381,11 +1431,8 @@ class ProductionOutboundAuditSync(ERPSyncBase):
     # 处理响应
 
     def process_erp_response(self, response):
-        print("ERP审核响应:",response)
-        if response['status'] != True:
-            raise ValueError(f"ERP审核失败: {response['message']}")
-        return response['data']
-
+        logger.info("ERP审核响应:",response)
+        return response['status']
 
 """采购入库保存"""
 class PurchaseInboundSaveSync(ERPSyncBase):
@@ -1415,8 +1462,8 @@ class PurchaseInboundSaveSync(ERPSyncBase):
         }
                  
     def process_erp_response(self, response):
-        print("ERP审核响应:",response)
-        return response['data']['purchase_order_id']
+        logger.info("ERP审核响应:",response)
+        return response['status']
 """销售出库保存"""
 class SaleOutboundSaveSync(ERPSyncBase):
    
@@ -1445,8 +1492,149 @@ class SaleOutboundSaveSync(ERPSyncBase):
         }
                  
     def process_erp_response(self, response):
-        print("ERP审核响应:",response)
-        return response['data']['purchase_order_id']
+        logger.info("ERP审核响应:",response)
+        return response['status']
+
+"""审核与保存接口"""
+class bound_apply(APIView):
+    """
+        入库单审核与保存
+        bill_base :0 入库单 1 出库单
+        bill_type :1 生产入库 2 采购入库 3 其他入库 4 调拨入库 2 生产出库 1 销售出库 3 其他出库
+    """
+    def post(self, request, action_type):
+        """统一处理 POST 请求,根据 action_type 分发逻辑"""
+        if action_type == 'audit':
+            # 调用 audit 逻辑
+            return self._audit(request)
+        elif action_type == 'save':
+            # 调用 save 逻辑
+            return self._save(request)
+        else:
+            return Response({'message': '无效操作'}, status=status.HTTP_400_BAD_REQUEST)
+        
+    def _audit(self, request):
+        """统一审核逻辑"""
+        # 参数校验
+        if error_response := self._validate_audit_params(request.data):
+            return error_response
+        
+        try:
+            # 获取审核配置
+            config = self._get_audit_config(request.data['billbase'], request.data['billtype'])
+            if not config:
+                return Response({'message': '无效的业务类型'}, status=status.HTTP_400_BAD_REQUEST)
+
+            # 处理审核业务
+            return self._process_audit(
+                bill_id=request.data['billid'],
+                config=config
+            )
+        except Exception as e:
+            logger.error(f"审核异常: {str(e)}", exc_info=True)
+            return Response({'message': '服务器处理失败'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+
+    def _validate_audit_params(self, data):
+        """参数验证"""
+        required_params = {'billid', 'billtype', 'billbase'}
+        if missing := [p for p in required_params if p not in data]:
+            return Response(
+                {'message': f'缺少必要参数: {", ".join(missing)}'},
+                status=status.HTTP_400_BAD_REQUEST
+            )
+        return None
+
+    def _get_audit_config(self, bill_base, bill_type):
+        """获取审核配置"""
+        config_map = {
+            # 入库单配置 (bill_base=0)
+            (0, 1): {'model': InboundBill, 'sync_class': ProductionInboundAuditSync, 'log_model': InboundBillOperateLog},
+            (0, 2): {'model': InboundBill, 'sync_class': PurchaseInboundAuditSync, 'log_model': InboundBillOperateLog},
+            (0, 3): {'model': InboundBill, 'sync_class': OtherInboundAuditSync, 'log_model': InboundBillOperateLog},
+            (0, 4): {'model': InboundBill, 'sync_class': TransferInboundAuditSync, 'log_model': InboundBillOperateLog},
+            
+            # 出库单配置 (bill_base=1)
+            (1, 2): {'model': OutboundBill, 'sync_class': ProductionOutboundAuditSync, 'log_model': OutboundBillOperateLog},
+            (1, 3): {'model': OutboundBill, 'sync_class': OtherOutboundAuditSync, 'log_model': OutboundBillOperateLog}
+        }
+        return config_map.get((bill_base, bill_type))
+
+    def _process_audit(self, bill_id, config):
+        """执行审核流程"""
+        # 获取单据对象
+        bill_obj = config['model'].objects.filter(billId=bill_id).first()
+        if not bill_obj:
+            return Response({'message': '单据不存在'}, status=status.HTTP_404_NOT_FOUND)
+
+        # 执行同步操作
+        sync_result = self._execute_sync(
+            sync_class=config['sync_class'],
+            bill_obj=bill_obj,
+            material_ids=[]
+        )
+        
+        if not sync_result:
+            return Response({'message': 'ERP审核失败'}, status=status.HTTP_404_NOT_FOUND)
+
+        # 记录操作日志
+        self._create_audit_log(
+            log_model=config['log_model'],
+            bill_obj=bill_obj
+        )
+
+        return Response({'message': '审核成功'}, status=status.HTTP_200_OK)
+
+    def _execute_sync(self, sync_class, bill_obj, material_ids):
+        """执行ERP同步"""
+        try:
+            return sync_class(bill_obj, material_ids).execute_sync()
+        except Exception as e:
+            logger.error(f"ERP同步失败: {str(e)}")
+            return False
+
+    def _create_audit_log(self, log_model, bill_obj):
+        """创建审核日志"""
+        log_model.objects.create(
+            billId=bill_obj,
+            log_type='erp_audit',
+            log_content='ERP审核成功'
+        )
+    def _save(self,request):
+        """保存"""
+        bill_id = request.data.get('billid', None)
+        bill_type = request.data.get('billtype', None)
+        bill_base = request.data.get('billbase', None)
+        if bill_id is None or bill_type is None or bill_base is None:
+            return Response({'message': '参数错误'}, status=status.HTTP_400_BAD_REQUEST)
+        try:
+            if bill_base == 0:
+  
+                if bill_type == 2:
+                    # 采购入库保存
+                    bill_obj = InboundBill.objects.filter(id=bill_id).first()
+                    if bill_obj:
+                        sync_obj = PurchaseInboundSaveSync(bill_obj,[])
+                        bill_obj.erp_save_id = sync_obj.execute_sync()
+                        bill_obj.save()
+                        return Response({'message': '保存成功'}, status=status.HTTP_200_OK)
+                    else:
+                        return Response({'message': '单据不存在'}, status=status.HTTP_400_BAD_REQUEST)
+            elif bill_base == 1:
+                if bill_type == 3:
+                    # 销售出库保存
+                    bill_obj = OutboundBill.objects.filter(id=bill_id).first()
+                    if bill_obj:
+                        sync_obj = SaleOutboundSaveSync(bill_obj,[])
+                        bill_obj.erp_save_id = sync_obj.execute_sync()
+                        bill_obj.save()
+                        return Response({'message': '保存成功'}, status=status.HTTP_200_OK)
+                    else:
+                        return Response({'message': '单据不存在'}, status=status.HTTP_400_BAD_REQUEST)
+            else:
+                return Response({'message': '参数错误'}, status=status.HTTP_400_BAD_REQUEST)
+        except Exception as e:
+            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+                        
 """前端视图类·ERP入库"""
 class InboundBills(viewsets.ModelViewSet):
     """
@@ -1484,10 +1672,23 @@ class InboundBills(viewsets.ModelViewSet):
 
     def get_serializer_class(self):
         # 根据操作类型选择合适的序列化器
-        if self.action in ['list', 'retrieve', ]:
+        if self.action in ['list', 'retrieve']:
             return InboundApplySerializer
         else:
             return self.http_method_not_allowed(request=self.request)
+        
+    def get_bound_number(self,request):
+        billid = request.data.get('billid', None)
+        bill_obj = InboundBill.objects.filter(billId=billid).first()
+        return_data = {}
+        if bill_obj:
+            return_data['bill_number'] = bill_obj.number
+            return_data['bill_audit'] = bill_obj.erp_audit_id
+            return_data['bill_save'] = bill_obj.erp_save_id
+            return_data['bill_status'] = bill_obj.bound_status
+            return_data['bill_type'] = bill_obj.type
+        return Response(return_data,status=status.HTTP_200_OK)
+    
 """前端视图类·ERP出库"""
 class OutboundBills(viewsets.ModelViewSet):
     """
@@ -1529,7 +1730,7 @@ class OutboundBills(viewsets.ModelViewSet):
             return OutboundApplySerializer
         else:
             return self.http_method_not_allowed(request=self.request)
-
+        
 class Materials(viewsets.ModelViewSet):
     """
         retrieve:
@@ -1606,4 +1807,53 @@ class OutMaterials(viewsets.ModelViewSet):
         else:
             return self.http_method_not_allowed(request=self.request)
 
+class InboundBillsLog(viewsets.ModelViewSet):
+    """
+        retrieve:
+            Response a data list(get)
+        list:
+            Response a data list(all)
+    """
+
+    pagination_class = MyPageNumberPagination
+    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
+    ordering_fields = ["update_time", "create_time"]
+
 
+    def get_queryset(self):
+        billid = self.request.query_params.get('billid', None)
+        # body = json.loads(self.request.body)
+        # billid = body.get('billid', None)
+        if billid is None:
+            return InboundBillOperateLog.objects.none()
+        else:
+            
+            return InboundBillOperateLog.objects.filter(billId_id=billid)
+        
+    def get_serializer_class(self):
+        return InboundbillOperateLogSerializer
+
+class OutboundBillsLog(viewsets.ModelViewSet):
+    """
+        retrieve:
+            Response a data list(get)
+        list:
+            Response a data list(all)
+    """
+
+    pagination_class = MyPageNumberPagination
+    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
+    ordering_fields = ["update_time", "create_time"]
+
+    def get_queryset(self):
+            billid = self.request.query_params.get('billid', None)
+            # body = json.loads(self.request.body)
+            # billid = body.get('billid', None)
+            if billid is None:
+                return OutboundBillOperateLog.objects.none()
+            else:
+
+                return OutboundBillOperateLog.objects.filter(billId_id=billid)
+        
+    def get_serializer_class(self):
+        return OutboundbillOperateLogSerializer

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 65 - 0
logs/boundBill.log


+ 611 - 0
logs/error.log

@@ -4614,3 +4614,614 @@ Traceback (most recent call last):
   File "D:\Document\code\vue\greater_wms\.\erp\views.py", line 1645, in <genexpr>
     total = sum(1 for _ in f)
 UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 74: illegal multibyte sequence
+[2025-05-09 17:09:20,701][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/log/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 42, in list
+    serializer = self.get_serializer(page, many=True)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\generics.py", line 108, in get_serializer
+    serializer_class = self.get_serializer_class()
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\generics.py", line 122, in get_serializer_class
+    assert self.serializer_class is not None, (
+AssertionError: 'InboundBillsLog' should either include a `serializer_class` attribute, or override the `get_serializer_class()` method.
+[2025-05-09 17:09:20,705][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/log/ HTTP/1.1" 500 119976
+[2025-05-09 17:11:02,495][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/log/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 446, in get_attribute
+    return get_attribute(instance, self.source_attrs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 96, in get_attribute
+    instance = getattr(instance, attr)
+AttributeError: 'InboundBill' object has no attribute 'log_type'
+
+During handling of the above exception, another exception occurred:
+
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 43, in list
+    return self.get_paginated_response(serializer.data)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 768, in data
+    ret = super().data
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
+    self.child.to_representation(item) for item in iterable
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 509, in to_representation
+    attribute = field.get_attribute(instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 479, in get_attribute
+    raise type(exc)(msg)
+AttributeError: Got AttributeError when attempting to get a value for field `log_type` on serializer `InboundbillOperateLogSerializer`.
+The serializer field might be named incorrectly and not match any attribute or key on the `InboundBill` instance.
+Original exception text was: 'InboundBill' object has no attribute 'log_type'.
+[2025-05-09 17:11:02,498][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/log/ HTTP/1.1" 500 160120
+[2025-05-09 17:11:24,462][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/log/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 446, in get_attribute
+    return get_attribute(instance, self.source_attrs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 96, in get_attribute
+    instance = getattr(instance, attr)
+AttributeError: 'InboundBill' object has no attribute 'log_type'
+
+During handling of the above exception, another exception occurred:
+
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 43, in list
+    return self.get_paginated_response(serializer.data)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 768, in data
+    ret = super().data
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
+    self.child.to_representation(item) for item in iterable
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 509, in to_representation
+    attribute = field.get_attribute(instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 479, in get_attribute
+    raise type(exc)(msg)
+AttributeError: Got AttributeError when attempting to get a value for field `log_type` on serializer `InboundbillOperateLogSerializer`.
+The serializer field might be named incorrectly and not match any attribute or key on the `InboundBill` instance.
+Original exception text was: 'InboundBill' object has no attribute 'log_type'.
+[2025-05-09 17:11:24,472][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/log/ HTTP/1.1" 500 160120
+[2025-05-09 17:12:36,794][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/log/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 446, in get_attribute
+    return get_attribute(instance, self.source_attrs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 96, in get_attribute
+    instance = getattr(instance, attr)
+AttributeError: 'InboundBill' object has no attribute 'log_type'
+
+During handling of the above exception, another exception occurred:
+
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 43, in list
+    return self.get_paginated_response(serializer.data)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 768, in data
+    ret = super().data
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
+    self.child.to_representation(item) for item in iterable
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 509, in to_representation
+    attribute = field.get_attribute(instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 479, in get_attribute
+    raise type(exc)(msg)
+AttributeError: Got AttributeError when attempting to get a value for field `log_type` on serializer `InboundbillOperateLogSerializer`.
+The serializer field might be named incorrectly and not match any attribute or key on the `InboundBill` instance.
+Original exception text was: 'InboundBill' object has no attribute 'log_type'.
+[2025-05-09 17:12:36,803][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/log/ HTTP/1.1" 500 160120
+[2025-05-09 17:14:03,745][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/log/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 40, in list
+    page = self.paginate_queryset(queryset)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\generics.py", line 171, in paginate_queryset
+    return self.paginator.paginate_queryset(queryset, self.request, view=self)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\pagination.py", line 204, in paginate_queryset
+    self.page = paginator.page(page_number)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\paginator.py", line 75, in page
+    number = self.validate_number(number)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\paginator.py", line 53, in validate_number
+    if number > self.num_pages:
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\utils\functional.py", line 57, in __get__
+    res = instance.__dict__[self.name] = self.func(instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\paginator.py", line 102, in num_pages
+    if self.count == 0 and not self.allow_empty_first_page:
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\utils\functional.py", line 57, in __get__
+    res = instance.__dict__[self.name] = self.func(instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\paginator.py", line 97, in count
+    return len(self.object_list)
+TypeError: object of type 'Response' has no len()
+[2025-05-09 17:14:03,750][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/log/ HTTP/1.1" 500 141955
+[2025-05-09 17:19:19,282][django.request.log_response():241] [ERROR] Internal Server Error: /
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 220, in _get_response
+    response = response.render()
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 114, in render
+    self.content = self.rendered_content
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 90, in rendered_content
+    template = self.resolve_template(self.template_name)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 72, in resolve_template
+    return select_template(template, using=self.using)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\loader.py", line 47, in select_template
+    raise TemplateDoesNotExist(", ".join(template_name_list), chain=chain)
+django.template.exceptions.TemplateDoesNotExist: dist/spa/index.html
+[2025-05-09 17:19:19,289][django.server.log_message():187] [ERROR] "GET / HTTP/1.1" 500 97937
+[2025-05-09 18:32:44,644][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/log/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 38, in list
+    queryset = self.filter_queryset(self.get_queryset())
+  File "D:\Document\code\vue\greater_wms\erp\views.py", line 1677, in get_queryset
+    billid = self.request.body.get('billid', None)
+AttributeError: 'bytes' object has no attribute 'get'
+[2025-05-09 18:32:44,646][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/log/ HTTP/1.1" 500 114175
+[2025-05-09 18:34:55,772][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/log/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 38, in list
+    queryset = self.filter_queryset(self.get_queryset())
+  File "D:\Document\code\vue\greater_wms\erp\views.py", line 1678, in get_queryset
+    body = json.loads(self.request.body)
+  File "D:\language\python38\lib\json\__init__.py", line 357, in loads
+    return _default_decoder.decode(s)
+  File "D:\language\python38\lib\json\decoder.py", line 337, in decode
+    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
+  File "D:\language\python38\lib\json\decoder.py", line 355, in raw_decode
+    raise JSONDecodeError("Expecting value", s, err.value) from None
+json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
+[2025-05-09 18:34:55,792][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/log/ HTTP/1.1" 500 125757
+[2025-05-09 18:38:07,155][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/log/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 38, in list
+    queryset = self.filter_queryset(self.get_queryset())
+  File "D:\Document\code\vue\greater_wms\erp\views.py", line 1678, in get_queryset
+    body = json.loads(self.request.body)
+  File "D:\language\python38\lib\json\__init__.py", line 357, in loads
+    return _default_decoder.decode(s)
+  File "D:\language\python38\lib\json\decoder.py", line 337, in decode
+    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
+  File "D:\language\python38\lib\json\decoder.py", line 355, in raw_decode
+    raise JSONDecodeError("Expecting value", s, err.value) from None
+json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
+[2025-05-09 18:38:07,163][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/log/ HTTP/1.1" 500 125757
+[2025-05-09 18:39:38,739][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/log/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 38, in list
+    queryset = self.filter_queryset(self.get_queryset())
+  File "D:\Document\code\vue\greater_wms\erp\views.py", line 1678, in get_queryset
+    body = json.loads(self.request.body)
+  File "D:\language\python38\lib\json\__init__.py", line 357, in loads
+    return _default_decoder.decode(s)
+  File "D:\language\python38\lib\json\decoder.py", line 337, in decode
+    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
+  File "D:\language\python38\lib\json\decoder.py", line 355, in raw_decode
+    raise JSONDecodeError("Expecting value", s, err.value) from None
+json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
+[2025-05-09 18:39:38,742][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/log/ HTTP/1.1" 500 125757
+[2025-05-09 18:41:41,808][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/log/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 38, in list
+    queryset = self.filter_queryset(self.get_queryset())
+  File "D:\Document\code\vue\greater_wms\erp\views.py", line 1678, in get_queryset
+    body = json.loads(self.request.body)
+  File "D:\language\python38\lib\json\__init__.py", line 357, in loads
+    return _default_decoder.decode(s)
+  File "D:\language\python38\lib\json\decoder.py", line 337, in decode
+    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
+  File "D:\language\python38\lib\json\decoder.py", line 355, in raw_decode
+    raise JSONDecodeError("Expecting value", s, err.value) from None
+json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
+[2025-05-09 18:41:41,812][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/log/ HTTP/1.1" 500 125757
+[2025-05-10 00:32:41,487][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/number/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+TypeError: get_bound_number() takes 1 positional argument but 2 were given
+[2025-05-10 00:32:41,490][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/number/ HTTP/1.1" 500 106298
+[2025-05-10 00:33:34,424][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/number/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+TypeError: get_bound_number() takes 1 positional argument but 2 were given
+[2025-05-10 00:33:34,425][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/number/ HTTP/1.1" 500 106297
+[2025-05-10 00:33:52,450][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/number/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+TypeError: get_bound_number() takes 1 positional argument but 2 were given
+[2025-05-10 00:33:52,453][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/number/ HTTP/1.1" 500 106297
+[2025-05-10 00:34:04,690][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/number/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+TypeError: get_bound_number() takes 1 positional argument but 2 were given
+[2025-05-10 00:34:04,692][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/number/ HTTP/1.1" 500 106297
+[2025-05-10 00:36:04,727][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/number/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+TypeError: get_bound_number() takes 1 positional argument but 2 were given
+[2025-05-10 00:36:04,729][django.server.log_message():187] [ERROR] "GET /wms/inboundBills/number/ HTTP/1.1" 500 106297
+[2025-05-10 00:41:08,548][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/number/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\erp\views.py", line 1561, in get_bound_number
+    return_data['bill_status'] = bill_obj.status
+AttributeError: 'InboundBill' object has no attribute 'status'
+[2025-05-10 00:41:08,552][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/number/ HTTP/1.1" 500 110958
+[2025-05-10 00:41:11,066][django.request.log_response():241] [ERROR] Internal Server Error: /
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 220, in _get_response
+    response = response.render()
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 114, in render
+    self.content = self.rendered_content
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 90, in rendered_content
+    template = self.resolve_template(self.template_name)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 72, in resolve_template
+    return select_template(template, using=self.using)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\loader.py", line 47, in select_template
+    raise TemplateDoesNotExist(", ".join(template_name_list), chain=chain)
+django.template.exceptions.TemplateDoesNotExist: dist/spa/index.html
+[2025-05-10 00:41:11,067][django.server.log_message():187] [ERROR] "GET / HTTP/1.1" 500 97353
+[2025-05-10 00:41:12,679][django.request.log_response():241] [ERROR] Internal Server Error: /
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 220, in _get_response
+    response = response.render()
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 114, in render
+    self.content = self.rendered_content
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 90, in rendered_content
+    template = self.resolve_template(self.template_name)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 72, in resolve_template
+    return select_template(template, using=self.using)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\loader.py", line 47, in select_template
+    raise TemplateDoesNotExist(", ".join(template_name_list), chain=chain)
+django.template.exceptions.TemplateDoesNotExist: dist/spa/index.html
+[2025-05-10 00:41:12,680][django.server.log_message():187] [ERROR] "GET / HTTP/1.1" 500 97352
+[2025-05-10 01:41:39,542][django.request.log_response():241] [ERROR] Internal Server Error: /
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 220, in _get_response
+    response = response.render()
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 114, in render
+    self.content = self.rendered_content
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 90, in rendered_content
+    template = self.resolve_template(self.template_name)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 72, in resolve_template
+    return select_template(template, using=self.using)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\loader.py", line 47, in select_template
+    raise TemplateDoesNotExist(", ".join(template_name_list), chain=chain)
+django.template.exceptions.TemplateDoesNotExist: dist/spa/index.html
+[2025-05-10 01:41:39,544][django.server.log_message():187] [ERROR] "GET / HTTP/1.1" 500 97353
+[2025-05-10 01:41:40,465][django.request.log_response():241] [ERROR] Internal Server Error: /
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 220, in _get_response
+    response = response.render()
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 114, in render
+    self.content = self.rendered_content
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 90, in rendered_content
+    template = self.resolve_template(self.template_name)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\response.py", line 72, in resolve_template
+    return select_template(template, using=self.using)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\template\loader.py", line 47, in select_template
+    raise TemplateDoesNotExist(", ".join(template_name_list), chain=chain)
+django.template.exceptions.TemplateDoesNotExist: dist/spa/index.html
+[2025-05-10 01:41:40,468][django.server.log_message():187] [ERROR] "GET / HTTP/1.1" 500 97353
+[2025-05-10 01:51:52,350][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/audit/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\generic\base.py", line 103, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+TypeError: post() missing 1 required positional argument: 'action_type'
+[2025-05-10 01:51:52,352][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/audit/ HTTP/1.1" 500 106130
+[2025-05-10 02:01:44,571][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/audit/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\generic\base.py", line 103, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+TypeError: post() missing 1 required positional argument: 'action_type'
+[2025-05-10 02:01:44,574][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/audit/ HTTP/1.1" 500 106130
+[2025-05-10 02:03:25,832][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/audit/
+[2025-05-10 02:03:25,833][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/audit/ HTTP/1.1" 500 255
+[2025-05-10 02:03:41,667][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/audit/
+[2025-05-10 02:03:41,668][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/audit/ HTTP/1.1" 500 255
+[2025-05-10 02:05:49,776][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/audit/
+[2025-05-10 02:05:49,778][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/audit/ HTTP/1.1" 500 70
+[2025-05-10 02:05:55,159][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/audit/
+[2025-05-10 02:05:55,160][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/audit/ HTTP/1.1" 500 70
+[2025-05-10 02:06:38,051][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/audit/
+[2025-05-10 02:06:38,053][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/audit/ HTTP/1.1" 500 141
+[2025-05-10 02:13:26,129][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/audit/
+[2025-05-10 02:13:26,130][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/audit/ HTTP/1.1" 500 29
+[2025-05-10 02:13:58,172][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/audit/
+[2025-05-10 02:13:58,174][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/audit/ HTTP/1.1" 500 29
+[2025-05-10 02:14:07,241][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/save/
+[2025-05-10 02:14:07,242][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/save/ HTTP/1.1" 500 255
+[2025-05-10 02:18:53,596][django.request.log_response():241] [ERROR] Internal Server Error: /wms/inboundBills/audit/
+[2025-05-10 02:18:53,598][django.server.log_message():187] [ERROR] "POST /wms/inboundBills/audit/ HTTP/1.1" 500 29
+[2025-05-10 02:24:27,553][django.request.log_response():241] [ERROR] Internal Server Error: /wms/boundBills/audit/
+[2025-05-10 02:24:27,554][django.server.log_message():187] [ERROR] "POST /wms/boundBills/audit/ HTTP/1.1" 500 29
+[2025-05-10 02:24:41,585][django.request.log_response():241] [ERROR] Internal Server Error: /wms/boundBills/audit/
+[2025-05-10 02:24:41,586][django.server.log_message():187] [ERROR] "POST /wms/boundBills/audit/ HTTP/1.1" 500 29
+[2025-05-10 02:26:54,563][django.request.log_response():241] [ERROR] Internal Server Error: /wms/boundBills/save/
+[2025-05-10 02:26:54,565][django.server.log_message():187] [ERROR] "POST /wms/boundBills/save/ HTTP/1.1" 500 255
+[2025-05-10 02:27:55,765][django.request.log_response():241] [ERROR] Internal Server Error: /wms/boundBills/save/
+[2025-05-10 02:27:55,767][django.server.log_message():187] [ERROR] "POST /wms/boundBills/save/ HTTP/1.1" 500 255

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 2512 - 0
logs/server.log


+ 145 - 59
templates/src/pages/erp/erpasn.vue

@@ -442,49 +442,75 @@
               <q-card class="q-mb-md" bordered>
                 <q-card-section>
                   <template>
-                    <div class="text-h6 q-mb-md">对接信息</div>
-                    <div class="q-pa-md">
-                      <q-timeline color="primary">
-                        <q-timeline-entry
-                          v-for="(item, index) in timeline"
-                          :key="index"
-                          :subtitle="item.timestamp"
-                          side="left"
+                    <div class="text-h6 q-mb">
+                      {{ formatBSType(detail_type) }}对接信息
+                      <q-btn dense flat icon="cached" @click="get_log_list()">
+                        <q-tooltip
+                          content-class="bg-amber text-black shadow-4"
+                          :offset="[20, 20]"
+                          content-style="font-size: 12px"
                         >
-                          <div class="row items-center">
-                            <!-- 折叠按钮 -->
-                            <q-btn
-                              round
-                              dense
-                              flat
-                              icon=done_outline
-                              color="primary"
-                              class="q-mr-sm"
-                              @click="check_erp(item)"
-                            />
-
-                            <!-- 扩展项 -->
-                            <q-expansion-item
-                              class="col"
-                              v-model="item.expanded"
-                              expand-icon-class="text-primary"
-                              :label="item.title"
-                              header-class="text-primary"
-                            >
-                              <div class="q-pl-md">
-                                <div class="text-body2">{{ item.content }}</div>
-                                <!-- 可添加更多详情 -->
-                                <div
-                                  v-if="item.details"
-                                  class="text-caption text-grey q-pt-sm"
-                                >
-                                  {{ item.details }}
+                          刷新对接日志
+                        </q-tooltip>
+                      </q-btn>
+                      <q-space></q-space>
+                    </div>
+                    <div class="row q-gutter-x-md">
+                      <div class="q-pa-md col">
+                        <q-timeline color="primary">
+                          <q-timeline-entry
+                            v-for="(item, index) in logline"
+                            :key="index"
+                            :subtitle="
+                              item.create_time + ':' + item.log_content
+                            "
+                            side="left"
+                          >
+                          </q-timeline-entry>
+                        </q-timeline>
+                      </div>
+                      <div class="q-pa-md col">
+                        <q-timeline color="primary">
+                          <q-timeline-entry
+                            v-for="(item, index) in timeline"
+                            :key="index"
+                            :subtitle="item.timestamp"
+                            side="left"
+                          >
+                            <div class="row items-center">
+                              <q-btn
+                                round
+                                dense
+                                flat
+                                icon="done_outline"
+                                color="primary"
+                                class="q-mr-sm"
+                                @click="check_erp(item)"
+                              />
+                              <q-expansion-item
+                                class="col"
+                                v-model="item.expanded"
+                                expand-icon-class="text-primary"
+                                :label="item.title"
+                                header-class="text-primary"
+                              >
+                                <div class="q-pl-md">
+                                  <div class="text-body2">
+                                    {{ item.content }}
+                                  </div>
+                                  <!-- 可添加更多详情 -->
+                                  <div
+                                    v-if="item.details"
+                                    class="text-caption text-grey q-pt-sm"
+                                  >
+                                    {{ item.details }}
+                                  </div>
                                 </div>
-                              </div>
-                            </q-expansion-item>
-                          </div>
-                        </q-timeline-entry>
-                      </q-timeline>
+                              </q-expansion-item>
+                            </div>
+                          </q-timeline-entry>
+                        </q-timeline>
+                      </div>
                     </div>
                   </template>
                 </q-card-section>
@@ -524,7 +550,7 @@
 <router-view />
 
 <script>
-import { getauth, postauth, putauth, deleteauth } from "boot/axios_request";
+import { getauth, postauth, putauth, deleteauth, post } from "boot/axios_request";
 
 import { date, exportFile, LocalStorage } from "quasar";
 import { QToggle } from "quasar";
@@ -547,17 +573,14 @@ export default {
       authin: "0",
       warehouse_code: "",
       warehouse_name: "",
-
       searchUrl: "",
       pathname: "wms/inboundBills/",
       pathfilename: "bound/file/",
-
       pathname_previous: "",
       pathname_next: "",
       separator: "cell",
       loading: false,
       height: "",
-
       printObj: {
         id: "printMe",
         popTitle: this.$t("inbound.asn"),
@@ -574,10 +597,8 @@ export default {
       bound_department_list: [],
       bound_department_map: [],
       bound_status_list: [],
-
       product_list: [],
       product_map: [],
-
       columns: [
         { name: "detail", label: "详情", field: "detail", align: "center" },
         { name: "billId", label: "表单序号", field: "billId", align: "center" },
@@ -619,7 +640,6 @@ export default {
       detailid: 0,
       bar_code: "",
       error1: this.$t("goods.view_goodslist.error1"),
-
       max: 0,
       total: 0,
       paginationIpt: 1,
@@ -630,29 +650,31 @@ export default {
       confirmForm: false,
       choose_bill_id: "",
       choose_bill_code: "",
+      logline: [],
       timeline: [
         {
           timestamp: "入库汇报",
           title: "单据编码",
           content: "暂无",
-          expanded: false,
-          type:1
+          expanded: true,
+          type: 1,
         },
         {
           timestamp: "入库审核",
           title: "单据编码",
           content: "暂无",
-          expanded: false,
-          type:1
+          expanded: true,
+          type: 2,
         },
         {
           timestamp: "入库保存",
           title: "单据编码",
           content: "暂无",
-          expanded: false,
-          type:1
-        }
+          expanded: true,
+          type: 3,
+        },
       ],
+      detail_type: 0,
     };
   },
   computed: {
@@ -665,6 +687,73 @@ export default {
     },
   },
   methods: {
+    check_erp(item) {
+      var _this = this;
+      if (item.type == 1) {
+        _this.get_log_list();
+      }
+      else if (item.type == 2) {
+        postauth("wms/boundBills/audit/", { billid: _this.detailid ,billtype: _this.detail_type ,billbase: 0 })
+        .catch((err) => {
+          _this.$q.notify({
+            message: err.detail || "审核失败",
+            icon: "close",
+            color: "negative",
+          });
+        })
+      }
+      else if (item.type == 3) {
+        postauth("wms/boundBills/save/", { billid: _this.detailid ,billtype: _this.detail_type ,billbase: 0 })
+      }
+  
+    },
+    get_log_list() {
+      var _this = this;
+   
+      getauth("wms/inboundBills/log/?billid=" + _this.detailid)
+        .then((res) => {
+          if (res && res.results) {
+            _this.logline = res.results;
+          } else {
+            console.error("响应中没有 results 属性", res);
+          }
+        })
+        .catch((err) => {
+          _this.$q.notify({
+            message: err.detail || "获取日志列表时出错",
+            icon: "close",
+            color: "negative",
+          });
+        });
+
+      postauth("wms/inboundBills/number/", { billid: _this.detailid })
+        .then((res) => {
+          _this.timeline[0].title = res.bill_number;
+          _this.timeline[1].title = res.bill_audit;
+          _this.timeline[2].title = res.bill_save;
+          _this.detail_type = res.bill_type;
+          if (res.bill_status == 0) {
+            _this.timeline[0].content = "ERP已发起入库申请,请审核";
+            _this.timeline[1].content = "待质检(非生产入库无需关注)";
+            _this.timeline[2].content = "待保存";
+          } else if (res.bill_status == 1) {
+            _this.timeline[0].content = "ERP已发起入库申请,已审核";
+            _this.timeline[1].content = "已质检或无需质检";
+            _this.timeline[2].content = "待入库";
+          } else if (res.bill_status == 2) {
+            _this.timeline[0].content = "ERP已发起入库申请,已审核";
+            _this.timeline[1].content = "已质检或无需质检";
+            _this.timeline[2].content = "已入库";
+          }
+        })
+        .catch((err) => {
+          _this.$q.notify({
+            message: err.detail || "获取单据编号时出错",
+            icon: "close",
+            color: "negative",
+          });
+        });
+    },
     formatBSType(type) {
       switch (type) {
         case 1:
@@ -704,7 +793,6 @@ export default {
         base_type: "0",
         page_size: _this.pagination.rowsPerPage,
       };
-
       // 创建URLSearchParams处理参数
       const queryParams = new URLSearchParams({
         ...baseParams,
@@ -717,11 +805,9 @@ export default {
           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;
@@ -750,7 +836,6 @@ export default {
       }
       this.getSearchList(this.current);
     },
-
     // 带搜索条件加载
     getSearchList(page = 1) {
       this.current = page;
@@ -919,6 +1004,7 @@ export default {
         });
       console.log("batch查询的结果是:", _this.batch_detail);
       console.log("batch长度查询的结果是:", _this.batch_detail.length);
+      _this.get_log_list();
     },
     deleteDataSubmit() {
       var _this = this;

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

@@ -1461,7 +1461,7 @@ export default {
         });
       });
 
-    getauth("warehouse/department/", {})
+    getauth("warehouse/department/?max_page=1000", {})
       .then((res) => {
         _this.bound_department_list = res.results.map((item) => ({
           label: item.department_name,