Ver Fonte

erp接口完善

flower_mr há 1 mês atrás
pai
commit
79a9550e62
60 ficheiros alterados com 997 adições e 236 exclusões
  1. 96 9
      data_base/generate_warehouse.py
  2. BIN
      db.sqlite3
  3. BIN
      erp/__pycache__/models.cpython-38.pyc
  4. BIN
      erp/__pycache__/urls.cpython-38.pyc
  5. BIN
      erp/__pycache__/views.cpython-38.pyc
  6. 18 0
      erp/migrations/0009_materialdetail_status.py
  7. BIN
      erp/migrations/__pycache__/0009_materialdetail_status.cpython-38.pyc
  8. 5 0
      erp/models.py
  9. 175 36
      erp/views.py
  10. 212 0
      logs/boundBill.log
  11. 136 0
      logs/error.log
  12. 143 0
      logs/server.log
  13. 5 5
      templates/src/pages/dashboard/inboundAndOutbound.vue
  14. 5 5
      templates/src/pages/downloadcenter/downloadbinlist.vue
  15. 5 5
      templates/src/pages/downloadcenter/downloadgoodslist.vue
  16. 5 5
      templates/src/pages/downloadcenter/downloadinbound.vue
  17. 5 5
      templates/src/pages/downloadcenter/downloadoutbound.vue
  18. 5 5
      templates/src/pages/downloadcenter/downloadstocklist.vue
  19. 5 5
      templates/src/pages/goods/goodsbrand.vue
  20. 5 5
      templates/src/pages/goods/goodsclass.vue
  21. 5 5
      templates/src/pages/goods/goodscolor.vue
  22. 5 5
      templates/src/pages/goods/goodslist.vue
  23. 5 5
      templates/src/pages/goods/goodsorigin.vue
  24. 5 5
      templates/src/pages/goods/goodsshape.vue
  25. 5 5
      templates/src/pages/goods/goodsspecs.vue
  26. 5 5
      templates/src/pages/goods/goodsunit.vue
  27. 5 5
      templates/src/pages/inbound/more.vue
  28. 5 5
      templates/src/pages/inbound/predeliverystock.vue
  29. 5 5
      templates/src/pages/inbound/preloadstock.vue
  30. 5 5
      templates/src/pages/inbound/presortstock.vue
  31. 5 5
      templates/src/pages/inbound/shortage.vue
  32. 5 5
      templates/src/pages/outbound/backorder.vue
  33. 5 5
      templates/src/pages/outbound/freshorder.vue
  34. 5 5
      templates/src/pages/outbound/neworder.vue
  35. 5 5
      templates/src/pages/outbound/pickedstock.vue
  36. 5 5
      templates/src/pages/outbound/pickinglist.vue
  37. 5 5
      templates/src/pages/outbound/pickstock.vue
  38. 5 5
      templates/src/pages/outbound/pod.vue
  39. 5 5
      templates/src/pages/outbound/shippedstock.vue
  40. 5 5
      templates/src/pages/staff/stafflist.vue
  41. 5 5
      templates/src/pages/staff/stafflist_check_code.vue
  42. 3 3
      templates/src/pages/staff/stafftype.vue
  43. 5 5
      templates/src/pages/stock/binsize.vue
  44. 3 3
      templates/src/pages/stock/cyclecountrecorder.vue
  45. 3 3
      templates/src/pages/stock/handcountrecorder.vue
  46. 5 5
      templates/src/pages/stock/occupiedbin.vue
  47. 5 5
      templates/src/pages/stock/stocklist.vue
  48. 3 3
      templates/src/pages/warehouse/boundbusiness.vue
  49. 3 3
      templates/src/pages/warehouse/boundcodetype.vue
  50. 3 3
      templates/src/pages/warehouse/boundstatus.vue
  51. 3 3
      templates/src/pages/warehouse/boundtype.vue
  52. 3 3
      templates/src/pages/warehouse/department.vue
  53. 3 3
      templates/src/pages/warehouse/product.vue
  54. 3 3
      templates/src/pages/warehouse/warehouseset.vue
  55. BIN
      utils/__pycache__/throttle.cpython-38.pyc
  56. 3 1
      utils/throttle.py
  57. BIN
      warehouse/__pycache__/models.cpython-38.pyc
  58. 18 0
      warehouse/migrations/0002_productlistmodel_product_unit.py
  59. BIN
      warehouse/migrations/__pycache__/0002_productlistmodel_product_unit.cpython-38.pyc
  60. 1 0
      warehouse/models.py

+ 96 - 9
data_base/generate_warehouse.py

@@ -34,15 +34,102 @@ def main():
         )
         print(f"开始生成库位,仓库编码:{warehouse_code}")
         DepartmentListModel.objects.filter(openid="PDA1").delete()
-        DepartmentListModel.objects.create(
-            department_code="D01",
-            department_name="测试部门",
-            department_contact="测试联系人",
-            department_manager="测试经理",
-            openid="PDA1",
-            creater="测试创建人",
-            is_delete=False,
-        )
+        department_code_list = [
+                        "okyy01",
+                        "okyy0101",
+                        "okyy0102",
+                        "okyy010201",
+                        "okyy010202",
+                        "okyy0103",
+                        "okyy010301",
+                        "okyy010302",
+                        "okyy01030201",
+                        "okyy01030202",
+                        "okyy0104",
+                        "okyy0105",
+                        "okyy0106",
+                        "okyy010601",
+                        "okyy010602",
+                        "okyy010603",
+                        "okyy010604",
+                        "okyy0107",
+                        "okyy010701",
+                        "okyy01070101",
+                        "okyy01070102",
+                        "okyy010702",
+                        "okyy010703",
+                        "okyy010704",
+                        "okyy0108",
+                        "okyy0109",
+                        "okyy010901",
+                        "okyy010902",
+                        "okyy010903",
+                        "okyy0110",
+                        "okyy0111",
+                        "okyy011101",
+                        "okyy011102",
+                        "okyy0112",
+                        "okyy011201",
+                        "okyy011202",
+                        "okyy0113"]
+
+        department_name_list = [
+                        "成都欧康医药股份有限公司",
+                        "供应部",
+                        "综合部",
+                        "行政人事部",
+                        "工程部",
+                        "环安部",
+                        "环保部",
+                        "污水处理车间",
+                        "污水A区",
+                        "污水B区",
+                        "技术部",
+                        "内审部",
+                        "生产一部",
+                        "一车间",
+                        "三车间",
+                        "六车间",
+                        "生产一部办公室",
+                        "生产二部",
+                        "设备动力部",
+                        "设备部",
+                        "动力车间",
+                        "二车间",
+                        "五车间",
+                        "生产二部办公室",
+                        "研发中心",
+                        "营销中心",
+                        "物流单证部",
+                        "业务一部",
+                        "业务二部",
+                        "证券部",
+                        "质量部",
+                        "质保部QA",
+                        "质控部QC",
+                        "资财部",
+                        "仓储部",
+                        "财务部",
+                        "总经理"]
+
+        index = 0
+        for i in department_code_list:
+
+            DepartmentListModel.objects.create(
+                department_code=i,
+                department_name=department_name_list[index],
+                department_contact="联系方式",
+                department_manager="部门联系人",
+        
+                openid="PDA1",
+                creater="ERP",
+                is_delete=False,
+            )
+            index += 1
+
+
+
+            
         BoundTypeListModel.objects.filter(openid="PDA1").delete()
         BoundTypeListModel.objects.create(
             bound_type_code="B01",

BIN
db.sqlite3


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


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


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


+ 18 - 0
erp/migrations/0009_materialdetail_status.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.1.2 on 2025-05-07 14:26
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('erp', '0008_inboundbill_erp_audit_id_inboundbill_erp_save_id_and_more'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='materialdetail',
+            name='status',
+            field=models.IntegerField(choices=[(0, '未质检'), (1, '已质检')], default=0, verbose_name='质检状态'),
+        ),
+    ]

BIN
erp/migrations/__pycache__/0009_materialdetail_status.cpython-38.pyc


+ 5 - 0
erp/models.py

@@ -74,6 +74,10 @@ class MaterialDetail(models.Model):
         related_name='bill_id',
         verbose_name='所属入库单'
     )
+    STATUS_CHOICES = (
+        (0, '未质检'),
+        (1, '已质检'),
+    )
     entryIds = models.IntegerField(verbose_name='分录ID')
     production_batch = models.CharField(max_length=50, verbose_name='生产批次')
     goods_code = models.CharField(max_length=20, verbose_name='商品编码')
@@ -84,6 +88,7 @@ class MaterialDetail(models.Model):
     goods_total_weight = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='总重量', null=True)
     goods_unit = models.CharField(max_length=20, verbose_name='计量单位')
     note = models.TextField(blank=True, verbose_name='备注')
+    status = models.IntegerField(choices=STATUS_CHOICES, verbose_name='质检状态', default=0)
     create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
     update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
     is_delete = models.BooleanField(default=False, verbose_name='是否删除')

+ 175 - 36
erp/views.py

@@ -21,7 +21,7 @@ import time
 from django.db import transaction
 
 from bound.models import BoundListModel, BoundBatchModel, OutBatchModel,BoundDetailModel,OutBoundDetailModel,BatchLogModel
-
+from warehouse.models import ProductListModel   
 logger = logging.getLogger('wms.boundBill')
 
 class WMSResponse:
@@ -535,7 +535,7 @@ class GenerateOutbound(APIView):
         # 关联单据校验(双重校验机制)
         existing_bound = BoundListModel.objects.filter(
             Q(bound_desc__contains=f"生产出库单{bill_obj.number}") |
-            Q(relate_bill=bill_obj)
+            Q(relate_out_bill=bill_obj)
         ).first()
 
         if existing_bound:
@@ -558,12 +558,10 @@ class GenerateOutbound(APIView):
         batch_list = []
         detail_list = []
         log_list = []
-        goods_counter = defaultdict(int)
-        order_day=str(timezone.now().strftime('-%Y%m'))
-        order_month=str(timezone.now().strftime('%Y%m'))
+       
         for idx, material in enumerate(materials, 1):
             # 生成批次
-            MaterialDetail_obj = MaterialDetail.objects.get(billId=material.Material_entryIds)
+            MaterialDetail_obj = MaterialDetail.objects.get(entryIds=material.Material_entryIds.entryIds)
             batch_obj = BoundBatchModel.objects.get(relate_material=MaterialDetail_obj)
 
             batch = OutBatchModel(
@@ -574,48 +572,56 @@ class GenerateOutbound(APIView):
                 out_type = bill_obj.type,
                 out_note = bill_obj.note,
                 
-
                 warehouse_code='W01',
                 warehouse_name='立体仓',
                 
-                goods_code=material.goods_code,
-                goods_desc=material.goods_name,
-                goods_std=material.goods_std,
-                goods_unit=material.goods_unit,
-                goods_qty=material.actual_qty,
-                goods_weight=float(material.goods_weight),
-                goods_total_weight=float(material.goods_total_weight),
-                creater=bound_list.creater,
-                openid=bound_list.openid,
+                goods_code=MaterialDetail_obj.goods_code,
+                goods_desc=MaterialDetail_obj.goods_name,
+                goods_std=MaterialDetail_obj.goods_std,
+                goods_unit=MaterialDetail_obj.goods_unit,
+
+                goods_qty=batch_obj.goods_qty,
+                goods_out_qty=material.goods_out_qty,
+
+                status = 0,
+                container_number = 0,
+
+                goods_weight = 1,
+                goods_total_weight = material.goods_out_qty,
+
+                creater=bill_obj.creater,
+                openid='ERP',
+
                 relate_material=material
             )
             batch_list.append(batch)
 
             # 生成明细
-            detail_list.append(BoundDetailModel(
+            detail_list.append(OutBoundDetailModel(
                 bound_list=bound_list,
                 bound_batch=batch,
-                detail_code=f"{batch.bound_number}-DET",
+                bound_batch_number = batch_obj,
+                detail_code=f"{batch.out_number}-DET",
                 creater=bound_list.creater,
                 openid=bound_list.openid
             ))
 
             # 生成日志
             log_list.append(BatchLogModel(
-                batch_id=batch,
-                log_type=0,
+                batch_id=batch_obj,
+                log_type=1,
                 log_date=timezone.now(),
-                goods_code=batch.goods_code,
-                goods_desc=batch.goods_desc,
-                goods_qty=batch.goods_qty,
-                log_content=f"生产出库批次创建,来源单据:{bill_obj.number}",
+                goods_code=batch_obj.goods_code,
+                goods_desc=batch_obj.goods_desc,
+                goods_qty=batch.goods_out_qty,
+                log_content=f"生产出库批次创建,来源单据:{bill_obj.number},出库件数:{batch.goods_out_qty}",
                 creater=batch.creater,
                 openid=batch.openid
             ))
 
         # 批量写入数据库
-        BoundBatchModel.objects.bulk_create(batch_list)
-        BoundDetailModel.objects.bulk_create(detail_list)
+        OutBatchModel.objects.bulk_create(batch_list)
+        OutBoundDetailModel.objects.bulk_create(detail_list)
         BatchLogModel.objects.bulk_create(log_list)
 
     def create_bound_list(self, bill_obj):
@@ -634,8 +640,8 @@ class GenerateOutbound(APIView):
             bound_type='out',
             bound_desc=f"生产出库单{bill_obj.number}",
             bound_department=(bill_obj.department if bill_obj.department else 'D99'),
-            base_type=0,
-            bound_status='101',
+            base_type=1,
+            bound_status='201',
             creater=bill_obj.creater,
             openid='ERP',
             relate_out_bill=bill_obj 
@@ -844,27 +850,160 @@ class OutboundApplyCreate(APIView):
                 )
         return material_detail
 
-class BatchUpdate(APIView):
+class ProductInfo(APIView):
     """
     批次信息更新
     """
     authentication_classes = []  # 禁用所有认证类
     permission_classes = [AllowAny]  # 允许任意访问
+
     def post(self, request):
-        logger.info('批次信息更新')
-        serializer = BatchUpdateSerializer(data=request.data)
-        return Response(serializer.data, status=status.HTTP_200_OK)
+        data = request.data
+        total_count = data.get('totalCount', 0)
+        materials = data.get('materials', [])
+        
+        success_count = 0
+        fail_count = 0
+        fail_materials = []
 
-class ProductInfo(APIView):
+        try:
+            with transaction.atomic():  # 开启事务确保原子性
+                # 预查询已存在的产品ID
+                existing_ids = set(ProductListModel.objects.filter(
+                    id__in=[m.get('id') for m in materials if m.get('id')]
+                ).values_list('id', flat=True))
+
+                for material in materials:
+                    material_id = material.get('id')
+                    try:
+                        
+                        if material_id and material_id in existing_ids:
+                            instance = ProductListModel.objects.get(id=material_id)
+                            created = False
+                        else:
+                            instance = ProductListModel()
+                            created = True
+
+                        # 字段映射与校验
+                        instance.product_code = material.get('product_code', instance.product_code)
+                        instance.product_name = material.get('product_name', instance.product_name)
+                        instance.product_std = material.get('product_std', instance.product_std)
+                        instance.product_unit = material.get('product_unit', instance.product_unit or 'KG')
+                        
+                        # 必填字段校验[7](@ref)
+                        required_fields = ['product_code', 'product_name']
+                        if any(not getattr(instance, field) for field in required_fields):
+                            raise ValueError(f"Missing required fields: {required_fields}")
+
+                        instance.is_delete = False  # 强制重置删除标记[1](@ref)
+                        instance.full_clean()  # 触发模型验证[3](@ref)
+                        instance.save()
+
+                        success_count += 1
+                    except Exception as e:
+                        fail_count += 1
+                        error_msg = f"{type(e).__name__}: {str(e)}"
+                        logger.warning(f"Material processing failed: {material} | Error: {error_msg}")
+                        fail_materials.append({
+                            **material,
+                            "error": error_msg
+                        })
+                        
+                # 检查总数一致性[7](@ref)
+                if len(materials) != total_count:
+                    raise ValueError("Received materials count does not match totalCount")
+
+        except Exception as e:
+            logger.error(f"Batch update transaction failed: {str(e)}", exc_info=True)
+            return WMSResponse.error(
+                message=f"批量处理失败: {str(e)}",
+                total=total_count,
+                fail_count=fail_count,
+                fail_materials=fail_materials,
+                exception=e
+            )
+
+        return WMSResponse.success(
+            data=[],  # 根据需求可返回处理后的数据
+            total=total_count,
+            success=success_count
+        )
+
+class BatchUpdate(APIView):
     """
     商品信息查询
     """
     authentication_classes = []  # 禁用所有认证类
     permission_classes = [AllowAny]  # 允许任意访问
     def post(self, request):
-        logger.info('商品信息查询')
-        serializer = ProductInfoSerializer(data=request.data)
-        return Response(serializer.data, status=status.HTTP_200_OK)
+        data = request.data
+        total_count = data.get('totalCount', 0)
+        materials = data.get('materials', [])
+        
+        success_count = 0
+        fail_count = 0
+        fail_materials = []
+
+        try:
+            with transaction.atomic():  # 开启事务确保原子性
+                if total_count != len(materials):
+                    return WMSResponse.error(
+                        message="物料数量不匹配",
+                        total=total_count,
+                        fail_count=total_count
+                    )
+                for material in materials:
+                    material_billId = material.get('billId')
+                    material_entryId = material.get('entryIds')
+                    material_status = material.get('status')
+                    if material_status == 'passing':
+                        try:
+                            instance = MaterialDetail.objects.get(bound_billId_id=material_billId,entryIds=material_entryId)
+                            if not instance:
+                                logger.info("物料明细不存在")
+                                fail_materials.append({
+                                    **material,
+                                    "error": "物料明细不存在"
+                                })
+                                fail_count += 1
+                                continue
+                            instance.status = 1
+                            instance.save()
+                            success_count += 1
+                        except Exception as e:
+                            fail_count += 1
+                            error_msg = f"{type(e).__name__}: {str(e)}"
+                            logger.warning(f"Material processing failed: {material} | Error: {error_msg}")
+                            fail_materials.append({
+                                **material,
+                                "error": error_msg
+                            })
+                            
+                # 检查总数一致性[7](@ref)
+                if  success_count != total_count:
+                    return WMSResponse.error(
+                        message="单据编码与详细编码不匹配",
+                        total=total_count,
+                        fail_count=total_count,
+                        fail_materials=fail_materials
+                    )
+
+        except Exception as e:
+            logger.error(f"Batch update transaction failed: {str(e)}", exc_info=True)
+            return WMSResponse.error(
+                message=f"批量处理失败: {str(e)}",
+                total=total_count,
+                fail_count=fail_count,
+                fail_materials=fail_materials,
+                exception=e
+            )
+
+        return WMSResponse.success(
+            data=[],  
+            total=total_count,
+            success=success_count
+        )
+
 
 class AccessToken(APIView):
     """

Diff do ficheiro suprimidas por serem muito extensas
+ 212 - 0
logs/boundBill.log


+ 136 - 0
logs/error.log

@@ -4105,3 +4105,139 @@ Traceback (most recent call last):
   File "D:\Document\code\vue\greater_wms\.\bound\views.py", line 380, in create
     data['bound_batch_number'] = OutBatchModel.objects.get(id=data['bound_batch']).batch_number.id
 KeyError: 'bound_batch'
+[2025-05-07 10:33:40,734][django.request.log_response():241] [ERROR] Internal Server Error: /wms/productInfo
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\generic\base.py", line 103, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-05-07 10:34:30,604][django.request.log_response():241] [ERROR] Internal Server Error: /wms/productInfo
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\generic\base.py", line 103, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\erp\views.py", line 940, in post
+    serializer = ProductInfoSerializer(data=request.data)
+NameError: name 'ProductInfoSerializer' is not defined
+[2025-05-07 14:26:53,713][django.request.log_response():241] [ERROR] Internal Server Error: /wms/updateBatchInfo
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\generic\base.py", line 103, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-05-07 14:27:28,595][django.request.log_response():241] [ERROR] Internal Server Error: /wms/updateBatchInfo
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\generic\base.py", line 103, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'

+ 143 - 0
logs/server.log

@@ -4307,3 +4307,146 @@ Traceback (most recent call last):
   File "D:\Document\code\vue\greater_wms\.\bound\views.py", line 380, in create
     data['bound_batch_number'] = OutBatchModel.objects.get(id=data['bound_batch']).batch_number.id
 KeyError: 'bound_batch'
+[2025-05-07 09:51:13,533][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-05-07 09:52:17,038][django.request.log_response():241] [WARNING] Not Found: /cyclecount/qtyrecorviewset/
+[2025-05-07 10:33:26,183][django.request.log_response():241] [WARNING] Not Found: //wms/productInfo
+[2025-05-07 10:33:40,734][django.request.log_response():241] [ERROR] Internal Server Error: /wms/productInfo
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\generic\base.py", line 103, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-05-07 10:34:30,604][django.request.log_response():241] [ERROR] Internal Server Error: /wms/productInfo
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\generic\base.py", line 103, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\.\erp\views.py", line 940, in post
+    serializer = ProductInfoSerializer(data=request.data)
+NameError: name 'ProductInfoSerializer' is not defined
+[2025-05-07 10:37:10,260][django.request.log_response():241] [WARNING] Bad Request: /wms/productInfo
+[2025-05-07 14:26:53,713][django.request.log_response():241] [ERROR] Internal Server Error: /wms/updateBatchInfo
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\generic\base.py", line 103, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-05-07 14:27:28,595][django.request.log_response():241] [ERROR] Internal Server Error: /wms/updateBatchInfo
+Traceback (most recent call last):
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 472, in thread_handler
+    raise exc_info[1]
+  File "d:\language\python38\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
+    response = await get_response(request)
+  File "d:\language\python38\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
+    response = await wrapped_callback(
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 435, in __call__
+    ret = await asyncio.wait_for(future, timeout=None)
+  File "d:\language\python38\lib\asyncio\tasks.py", line 455, in wait_for
+    return await fut
+  File "d:\language\python38\lib\concurrent\futures\thread.py", line 57, in run
+    result = self.fn(*self.args, **self.kwargs)
+  File "d:\language\python38\lib\site-packages\asgiref\sync.py", line 476, in thread_handler
+    return func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\language\python38\lib\site-packages\django\views\generic\base.py", line 103, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 497, in dispatch
+    self.initial(request, *args, **kwargs)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 416, in initial
+    self.check_throttles(request)
+  File "d:\language\python38\lib\site-packages\rest_framework\views.py", line 359, in check_throttles
+    if not throttle.allow_request(request, self):
+  File "D:\Document\code\vue\greater_wms\.\utils\throttle.py", line 18, in allow_request
+    openid = request.auth.openid
+AttributeError: 'NoneType' object has no attribute 'openid'
+[2025-05-07 14:29:05,728][django.request.log_response():241] [WARNING] Bad Request: /wms/updateBatchInfo
+[2025-05-07 14:33:00,889][django.request.log_response():241] [WARNING] Bad Request: /wms/updateBatchInfo
+[2025-05-07 14:33:54,449][django.request.log_response():241] [WARNING] Bad Request: /wms/updateBatchInfo

+ 5 - 5
templates/src/pages/dashboard/inboundAndOutbound.vue

@@ -101,7 +101,7 @@ export default {
       ],
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -119,10 +119,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -159,10 +159,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/downloadcenter/downloadbinlist.vue

@@ -142,7 +142,7 @@ export default {
       ],
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       createDate1: '',
       createDate2: '',
@@ -190,10 +190,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -230,10 +230,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/downloadcenter/downloadgoodslist.vue

@@ -180,7 +180,7 @@ export default {
       ],
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       createDate1: '',
       createDate2: '',
@@ -228,10 +228,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -268,10 +268,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/downloadcenter/downloadinbound.vue

@@ -140,7 +140,7 @@ export default {
       ],
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       createDate1: '',
       createDate2: '',
@@ -208,10 +208,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -264,10 +264,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/downloadcenter/downloadoutbound.vue

@@ -140,7 +140,7 @@ export default {
       ],
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       createDate1: '',
       createDate2: '',
@@ -209,10 +209,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           res.results.forEach(item => {
@@ -271,10 +271,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/downloadcenter/downloadstocklist.vue

@@ -182,7 +182,7 @@ export default {
       ],
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       createDate1: '',
       createDate2: '',
@@ -230,10 +230,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -268,10 +268,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/goods/goodsbrand.vue

@@ -198,7 +198,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       newForm: false,
       newFormData: {
@@ -228,10 +228,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -269,10 +269,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/goods/goodsclass.vue

@@ -198,7 +198,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       newForm: false,
       newFormData: {
@@ -228,10 +228,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -269,10 +269,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/goods/goodscolor.vue

@@ -198,7 +198,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       newForm: false,
       newFormData: {
@@ -228,10 +228,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -269,10 +269,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/goods/goodslist.vue

@@ -665,7 +665,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       newForm: false,
       newFormData: {
@@ -725,10 +725,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.goods_unit_list = res.goods_unit_list
@@ -774,10 +774,10 @@ export default {
             if (res.count === 0) {
               _this.max = 0
             } else {
-              if (Math.ceil(res.count / 30) === 1) {
+              if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
                 _this.max = 0
               } else {
-                _this.max = Math.ceil(res.count / 30)
+                _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
               }
             }
             _this.goods_unit_list = res.goods_unit_list

+ 5 - 5
templates/src/pages/goods/goodsorigin.vue

@@ -198,7 +198,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       newForm: false,
       newFormData: {
@@ -228,10 +228,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -269,10 +269,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/goods/goodsshape.vue

@@ -198,7 +198,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       newForm: false,
       newFormData: {
@@ -228,10 +228,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -269,10 +269,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/goods/goodsspecs.vue

@@ -198,7 +198,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       newForm: false,
       newFormData: {
@@ -228,10 +228,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -269,10 +269,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/goods/goodsunit.vue

@@ -198,7 +198,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       newForm: false,
       newFormData: {
@@ -228,10 +228,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -269,10 +269,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/inbound/more.vue

@@ -131,7 +131,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage:11
       },
       current: 1,
       max: 0,
@@ -150,10 +150,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -191,10 +191,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/inbound/predeliverystock.vue

@@ -131,7 +131,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -150,10 +150,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -191,10 +191,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/inbound/preloadstock.vue

@@ -131,7 +131,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -150,10 +150,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -191,10 +191,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/inbound/presortstock.vue

@@ -131,7 +131,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -150,10 +150,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -191,10 +191,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/inbound/shortage.vue

@@ -131,7 +131,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -150,10 +150,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -191,10 +191,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/outbound/backorder.vue

@@ -150,7 +150,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -169,10 +169,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -210,10 +210,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/outbound/freshorder.vue

@@ -131,7 +131,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -150,10 +150,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -191,10 +191,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/outbound/neworder.vue

@@ -131,7 +131,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -150,10 +150,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -191,10 +191,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/outbound/pickedstock.vue

@@ -127,7 +127,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -146,10 +146,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -187,10 +187,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/outbound/pickinglist.vue

@@ -123,7 +123,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -142,10 +142,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -183,10 +183,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/outbound/pickstock.vue

@@ -131,7 +131,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -150,10 +150,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -191,10 +191,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/outbound/pod.vue

@@ -139,7 +139,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -158,10 +158,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -199,10 +199,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/outbound/shippedstock.vue

@@ -127,7 +127,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -146,10 +146,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -187,10 +187,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/staff/stafflist.vue

@@ -243,7 +243,7 @@ export default {
       ],
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       newForm: false,
       newFormData: {
@@ -275,10 +275,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           if (LocalStorage.getItem('lang') === 'zh-hans') {
@@ -337,10 +337,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           if (LocalStorage.getItem('lang') === 'zh-hans') {

+ 5 - 5
templates/src/pages/staff/stafflist_check_code.vue

@@ -89,7 +89,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -108,10 +108,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           if (LocalStorage.getItem('lang') === 'zh-hans') {
@@ -170,10 +170,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           if (LocalStorage.getItem('lang') === 'zh-hans') {

+ 3 - 3
templates/src/pages/staff/stafftype.vue

@@ -98,7 +98,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -117,10 +117,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           if (LocalStorage.getItem('lang') === 'zh-hans') {

+ 5 - 5
templates/src/pages/stock/binsize.vue

@@ -281,7 +281,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       newForm: false,
       newFormData: {
@@ -317,10 +317,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous
@@ -358,10 +358,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 3 - 3
templates/src/pages/stock/cyclecountrecorder.vue

@@ -123,7 +123,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       options: [],
       date: '',
@@ -151,10 +151,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

+ 3 - 3
templates/src/pages/stock/handcountrecorder.vue

@@ -179,7 +179,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       options: [],
       date: '',
@@ -207,10 +207,10 @@ export default {
             if (res.count === 0) {
               _this.max = 0
             } else {
-              if (Math.ceil(res.count / 30) === 1) {
+              if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
                 _this.max = 0
               } else {
-                _this.max = Math.ceil(res.count / 30)
+                _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
               }
             }
             _this.pathname_previous = res.previous

+ 5 - 5
templates/src/pages/stock/occupiedbin.vue

@@ -125,7 +125,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       options: [],
       moveForm: false,
@@ -148,10 +148,10 @@ export default {
             if (res.count === 0) {
               _this.max = 0
             } else {
-              if (Math.ceil(res.count / 30) === 1) {
+              if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
                 _this.max = 0
               } else {
-                _this.max = Math.ceil(res.count / 30)
+                _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
               }
             }
 
@@ -191,10 +191,10 @@ export default {
             if (res.count === 0) {
               _this.max = 0
             } else {
-              if (Math.ceil(res.count / 30) === 1) {
+              if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
                 _this.max = 0
               } else {
-                _this.max = Math.ceil(res.count / 30)
+                _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
               }
             }
 

+ 5 - 5
templates/src/pages/stock/stocklist.vue

@@ -128,7 +128,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       current: 1,
       max: 0,
@@ -146,10 +146,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous;
@@ -187,10 +187,10 @@ export default {
             if (res.count === 0) {
               _this.max = 0
             } else {
-              if (Math.ceil(res.count / 30) === 1) {
+              if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
                 _this.max = 0
               } else {
-                _this.max = Math.ceil(res.count / 30)
+                _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
               }
             }
             _this.pathname_previous = res.previous;

+ 3 - 3
templates/src/pages/warehouse/boundbusiness.vue

@@ -195,7 +195,7 @@
         filter: '',
         pagination: {
           page: 1,
-          rowsPerPage: '30'
+          rowsPerPage: 11
         },
         newForm: false,
         newFormData: {
@@ -236,10 +236,10 @@
             if (res.count === 0) {
               _this.max = 0
             } else {
-              if (Math.ceil(res.count / 30) === 1) {
+              if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
                 _this.max = 0
               } else {
-                _this.max = Math.ceil(res.count / 30)
+                _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
               }
             }
             _this.pathname_previous = res.previous

+ 3 - 3
templates/src/pages/warehouse/boundcodetype.vue

@@ -194,7 +194,7 @@
         filter: '',
         pagination: {
           page: 1,
-          rowsPerPage: '30'
+          rowsPerPage: 11
         },
         newForm: false,
         newFormData: {
@@ -235,10 +235,10 @@
             if (res.count === 0) {
               _this.max = 0
             } else {
-              if (Math.ceil(res.count / 30) === 1) {
+              if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
                 _this.max = 0
               } else {
-                _this.max = Math.ceil(res.count / 30)
+                _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
               }
             }
             _this.pathname_previous = res.previous

+ 3 - 3
templates/src/pages/warehouse/boundstatus.vue

@@ -195,7 +195,7 @@
         filter: '',
         pagination: {
           page: 1,
-          rowsPerPage: '30'
+          rowsPerPage: 11
         },
         newForm: false,
         newFormData: {
@@ -236,10 +236,10 @@
             if (res.count === 0) {
               _this.max = 0
             } else {
-              if (Math.ceil(res.count / 30) === 1) {
+              if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
                 _this.max = 0
               } else {
-                _this.max = Math.ceil(res.count / 30)
+                _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
               }
             }
             _this.pathname_previous = res.previous

+ 3 - 3
templates/src/pages/warehouse/boundtype.vue

@@ -195,7 +195,7 @@
         filter: '',
         pagination: {
           page: 1,
-          rowsPerPage: '30'
+          rowsPerPage: 11
         },
         newForm: false,
         newFormData: {
@@ -236,10 +236,10 @@
             if (res.count === 0) {
               _this.max = 0
             } else {
-              if (Math.ceil(res.count / 30) === 1) {
+              if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
                 _this.max = 0
               } else {
-                _this.max = Math.ceil(res.count / 30)
+                _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
               }
             }
             _this.pathname_previous = res.previous

+ 3 - 3
templates/src/pages/warehouse/department.vue

@@ -231,7 +231,7 @@
         filter: '',
         pagination: {
           page: 1,
-          rowsPerPage: '30'
+          rowsPerPage: 11
         },
         newForm: false,
         newFormData: {
@@ -273,10 +273,10 @@
             if (res.count === 0) {
               _this.max = 0
             } else {
-              if (Math.ceil(res.count / 30) === 1) {
+              if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
                 _this.max = 0
               } else {
-                _this.max = Math.ceil(res.count / 30)
+                _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
               }
             }
             _this.pathname_previous = res.previous

+ 3 - 3
templates/src/pages/warehouse/product.vue

@@ -214,7 +214,7 @@
         filter: '',
         pagination: {
           page: 1,
-          rowsPerPage: '30'
+          rowsPerPage: 11
         },
         newForm: false,
         newFormData: {
@@ -254,10 +254,10 @@
             if (res.count === 0) {
               _this.max = 0
             } else {
-              if (Math.ceil(res.count / 30) === 1) {
+              if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
                 _this.max = 0
               } else {
-                _this.max = Math.ceil(res.count / 30)
+                _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
               }
             }
             _this.pathname_previous = res.previous

+ 3 - 3
templates/src/pages/warehouse/warehouseset.vue

@@ -257,7 +257,7 @@ export default {
       filter: '',
       pagination: {
         page: 1,
-        rowsPerPage: '30'
+        rowsPerPage: 11
       },
       newForm: false,
       newFormData: {
@@ -300,10 +300,10 @@ export default {
           if (res.count === 0) {
             _this.max = 0
           } else {
-            if (Math.ceil(res.count / 30) === 1) {
+            if (Math.ceil(res.count / _this.pagination.rowsPerPage) === 1) {
               _this.max = 0
             } else {
-              _this.max = Math.ceil(res.count / 30)
+              _this.max = Math.ceil(res.count / _this.pagination.rowsPerPage)
             }
           }
           _this.pathname_previous = res.previous

BIN
utils/__pycache__/throttle.cpython-38.pyc


+ 3 - 1
utils/throttle.py

@@ -10,7 +10,9 @@ class VisitThrottle(BaseThrottle):
     def allow_request(self, request, view):
         if request.path in ['/api/docs/', '/api/debug/', '/api/']:
             return (False, None)
-        elif request.path in ['/container/container_wcs/','/container/container_wcs/update/','/container/batch/','/wms/createInboundApply','/wms/createOutboundApply']:
+        elif request.path in ['/container/container_wcs/','/container/container_wcs/update/',
+                                '/container/batch/','/wms/createInboundApply','/wms/createOutboundApply'
+                                ,'/wms/productInfo','/wms/updateBatchInfo']:
             return True
         else:
             ip = request.META.get('HTTP_X_FORWARDED_FOR') if request.META.get(

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


+ 18 - 0
warehouse/migrations/0002_productlistmodel_product_unit.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.1.2 on 2025-05-07 10:10
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('warehouse', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='productlistmodel',
+            name='product_unit',
+            field=models.CharField(default='KG', max_length=255, verbose_name='Product Unit'),
+        ),
+    ]

BIN
warehouse/migrations/__pycache__/0002_productlistmodel_product_unit.cpython-38.pyc


+ 1 - 0
warehouse/models.py

@@ -105,6 +105,7 @@ class ProductListModel(models.Model):
     product_code = models.CharField(max_length=255, verbose_name="Product Code"  )
     product_name = models.CharField(max_length=255, verbose_name="Product Name")
     product_std = models.CharField(max_length=255, verbose_name="Product Description")
+    product_unit = models.CharField(default='KG', max_length=255, verbose_name="Product Unit")
 
     creater = models.CharField(default='first', max_length=255, verbose_name="Who Created")
     is_delete = models.BooleanField(default=False, verbose_name='Delete Label')