flower_bs 3 tuần trước cách đây
mục cha
commit
bbf3cb3e4c
64 tập tin đã thay đổi với 1619 bổ sung158 xóa
  1. 4 0
      bin/serializers.py
  2. 2 0
      bin/urls.py
  3. 297 3
      bin/views.py
  4. 14 2
      container/views.py
  5. 0 1
      templates/dist/spa/css/10.009f6600.css
  6. 1 0
      templates/dist/spa/css/10.d66de84e.css
  7. 0 1
      templates/dist/spa/css/3.98304b39.css
  8. 1 0
      templates/dist/spa/css/3.bfd66d46.css
  9. 0 1
      templates/dist/spa/css/34.0d4c4716.css
  10. 0 0
      templates/dist/spa/css/34.5557cd4a.css
  11. 0 0
      templates/dist/spa/css/35.8f3f6188.css
  12. 0 0
      templates/dist/spa/css/36.44ddcebd.css
  13. 0 0
      templates/dist/spa/css/37.2ac1dad1.css
  14. 0 0
      templates/dist/spa/css/38.12670fd1.css
  15. 0 0
      templates/dist/spa/css/39.9478c981.css
  16. 0 1
      templates/dist/spa/css/4.1df4ea51.css
  17. 1 0
      templates/dist/spa/css/4.66ad7197.css
  18. 0 0
      templates/dist/spa/css/40.c4652654.css
  19. 0 0
      templates/dist/spa/css/41.7a23b7fb.css
  20. 1 0
      templates/dist/spa/css/42.07732723.css
  21. 0 1
      templates/dist/spa/css/chunk-common.ab88e7ab.css
  22. 1 0
      templates/dist/spa/css/chunk-common.e7ea1610.css
  23. 1 1
      templates/dist/spa/index.html
  24. 0 1
      templates/dist/spa/js/10.6404af04.js
  25. BIN
      templates/dist/spa/js/10.6404af04.js.gz
  26. 1 0
      templates/dist/spa/js/10.7083f21f.js
  27. BIN
      templates/dist/spa/js/10.7083f21f.js.gz
  28. 0 1
      templates/dist/spa/js/3.4366e891.js
  29. BIN
      templates/dist/spa/js/3.4366e891.js.gz
  30. 1 0
      templates/dist/spa/js/3.d2c5199b.js
  31. BIN
      templates/dist/spa/js/3.d2c5199b.js.gz
  32. 1 1
      templates/dist/spa/js/35.08b4d310.js
  33. BIN
      templates/dist/spa/js/35.08b4d310.js.gz
  34. 0 1
      templates/dist/spa/js/34.fe660215.js
  35. 1 1
      templates/dist/spa/js/36.0ef8719a.js
  36. BIN
      templates/dist/spa/js/35.73cf8fc6.js.gz
  37. 1 1
      templates/dist/spa/js/37.faa1b078.js
  38. BIN
      templates/dist/spa/js/37.faa1b078.js.gz
  39. BIN
      templates/dist/spa/js/36.0ef8719a.js.gz
  40. 1 1
      templates/dist/spa/js/38.51ed54fd.js
  41. BIN
      templates/dist/spa/js/37.54c90e2b.js.gz
  42. BIN
      templates/dist/spa/js/38.51ed54fd.js.gz
  43. 1 1
      templates/dist/spa/js/39.d57f53e6.js
  44. BIN
      templates/dist/spa/js/39.d57f53e6.js.gz
  45. 1 1
      templates/dist/spa/js/40.0df87f4e.js
  46. 0 1
      templates/dist/spa/js/4.08fdf7c6.js
  47. BIN
      templates/dist/spa/js/4.08fdf7c6.js.gz
  48. 1 0
      templates/dist/spa/js/4.4b393725.js
  49. BIN
      templates/dist/spa/js/4.4b393725.js.gz
  50. 1 1
      templates/dist/spa/js/41.0f33ab80.js
  51. 1 1
      templates/dist/spa/js/42.f341b76d.js
  52. 1 0
      templates/dist/spa/js/42.95116c09.js
  53. BIN
      templates/dist/spa/js/42.95116c09.js.gz
  54. 1 1
      templates/dist/spa/js/app.805f1cc7.js
  55. BIN
      templates/dist/spa/js/app.2dbb2966.js.gz
  56. BIN
      templates/dist/spa/js/app.805f1cc7.js.gz
  57. 1 0
      templates/dist/spa/js/chunk-common.82036531.js
  58. BIN
      templates/dist/spa/js/chunk-common.82036531.js.gz
  59. 0 1
      templates/dist/spa/js/chunk-common.9aae00f4.js
  60. BIN
      templates/dist/spa/js/chunk-common.9aae00f4.js.gz
  61. 1 1
      templates/dist/spa/js/vendor.1ba90913.js
  62. BIN
      templates/dist/spa/js/vendor.1ba90913.js.gz
  63. 1 8
      templates/src/pages/stock/management.vue
  64. 1280 124
      templates/src/pages/stock/stockbinlist.vue

+ 4 - 0
bin/serializers.py

@@ -45,6 +45,10 @@ class LocationGroupPostSerializer(serializers.ModelSerializer):
         model = LocationGroupModel
         fields = '__all__'
         read_only_fields = ['id']
+        extra_kwargs = {
+            'current_goods_code': {'required': False, 'allow_blank': True},
+            'current_batch': {'required': False, 'allow_blank': True},
+        }
 
 
 

+ 2 - 0
bin/urls.py

@@ -7,6 +7,8 @@ urlpatterns = [
     re_path(r'^(?P<pk>\d+)/$',  views.locationViewSet.as_view({"get": "retrieve", "put": "update"}), name='location_detail'),
 
     path (r'group/', views.locationGroupViewSet.as_view({"get": "list"}), name='location_list'),
+    path (r'group/check-pallet-consistency/', views.locationGroupViewSet.as_view({"get": "check_pallet_consistency"}), name='location_group_check_pallet_consistency'),
+    path (r'group/fix-pallet-consistency/', views.locationGroupViewSet.as_view({"post": "fix_pallet_consistency"}), name='location_group_fix_pallet_consistency'),
     re_path(r'^group/(?P<pk>\d+)/$',  views.locationGroupViewSet.as_view({"get": "retrieve", "put": "update"}), name='location_detail'),
     # path(r'management/', views.stockshelfViewSet.as_view({"get": "list", "post": "create"}), name="management"),
     # re_path(r'^management/(?P<pk>\d+)/$', views.stockshelfViewSet.as_view({'get': 'retrieve','put': 'update','patch': 'partial_update','delete': 'destroy'}), name="staff_1"),

+ 297 - 3
bin/views.py

@@ -11,6 +11,7 @@ from django.utils import timezone
 from django.db import transaction
 import logging
 from rest_framework import status
+from rest_framework.decorators import action
 from .models import DeviceModel,LocationModel,LocationGroupModel,LocationContainerLink,LocationChangeLog,alloction_pre,base_location
 from bound.models import BoundBatchModel,BoundDetailModel,BoundListModel
 
@@ -21,7 +22,7 @@ from .serializers import LocationGroupListSerializer,LocationGroupPostSerializer
 # 以后添加模块时,只需要在这里添加即可
 from rest_framework.permissions import AllowAny
 from container.models import ContainerListModel,ContainerDetailModel,ContainerOperationModel,TaskModel
-from django.db.models import Prefetch
+from django.db.models import Prefetch, Count, Q
 import copy
 import json
 from collections import defaultdict
@@ -461,8 +462,8 @@ class locationGroupViewSet(viewsets.ModelViewSet):
         if group_obj:
             data['id'] = group_obj.id
             logger.info(f"库位组 {group_code} 已存在")
-            # 更新现有库位组
-            serializer = LocationGroupPostSerializer(group_obj, data=data)
+            # 更新现有库位组,支持部分字段更新
+            serializer = LocationGroupPostSerializer(group_obj, data=data, partial=True)
             try:
                 serializer.is_valid(raise_exception=True)
                 serializer.save()
@@ -501,6 +502,299 @@ class locationGroupViewSet(viewsets.ModelViewSet):
             data['id'] = serializer_list.data.get('id')
             return Response(data, status=status.HTTP_201_CREATED)
 
+    def check_pallet_consistency(self, request):
+        """
+        检测库位组当前托盘数与激活的Link记录数量是否一致
+        """
+        if not request.auth:
+            return Response(
+                {'code': '401', 'message': '未授权访问', 'data': None},
+                status=status.HTTP_401_UNAUTHORIZED
+            )
+
+        only_inconsistent = str(request.query_params.get('only_inconsistent', 'true')).lower() in {'1', 'true', 'yes', 'on'}
+        warehouse_code = request.query_params.get('warehouse_code')
+        group_code = request.query_params.get('group_code')
+        layer_param = request.query_params.get('layer')
+
+        filters = {'is_active': True}
+        if warehouse_code:
+            filters['warehouse_code'] = warehouse_code
+        if group_code:
+            filters['group_code'] = group_code
+
+        if layer_param:
+            try:
+                filters['layer'] = int(layer_param)
+            except (TypeError, ValueError):
+                pass
+
+        prefetch_active_links = Prefetch(
+            'location_items',
+            queryset=LocationModel.objects.prefetch_related(
+                Prefetch(
+                    'container_links',
+                    queryset=LocationContainerLink.objects.filter(is_active=True),
+                    to_attr='active_links'
+                )
+            ),
+            to_attr='prefetched_locations'
+        )
+
+        groups_qs = LocationGroupModel.objects.filter(**filters).annotate(
+            active_pallets=Count(
+                'location_items__container_links',
+                filter=Q(location_items__container_links__is_active=True),
+                distinct=True
+            )
+        ).prefetch_related(prefetch_active_links)
+
+        total_groups = groups_qs.count()
+        inconsistent_groups = 0
+        result_data = []
+
+        for group in groups_qs:
+            locations = getattr(group, 'prefetched_locations', [])
+            actual_quantity = getattr(group, 'active_pallets', 0)
+            recorded_quantity = group.current_quantity
+            is_consistent = recorded_quantity == actual_quantity
+
+            if not is_consistent:
+                inconsistent_groups += 1
+
+            if only_inconsistent and is_consistent:
+                continue
+
+            location_details = []
+            if not is_consistent:
+                for location in locations:
+                    active_links = getattr(location, 'active_links', [])
+                    active_count = len(active_links)
+                    location_details.append({
+                        'location_id': location.id,
+                        'location_code': location.location_code,
+                        'status': location.status,
+                        'recorded_quantity': location.current_quantity,
+                        'link_quantity': active_count,
+                        'difference': active_count - location.current_quantity
+                    })
+
+            result_data.append({
+                'group_id': group.id,
+                'group_code': group.group_code,
+                'group_name': group.group_name,
+                'warehouse_code': group.warehouse_code,
+                'layer': group.layer,
+                'status': group.status,
+                'recorded_quantity': recorded_quantity,
+                'link_quantity': actual_quantity,
+                'difference': actual_quantity - recorded_quantity,
+                'is_consistent': is_consistent,
+                'locations': location_details
+            })
+
+        log_operation(
+            request=self.request,
+            operation_content=f"执行库位组托盘数一致性检测,共检测 {total_groups} 个库位组,发现 {inconsistent_groups} 个异常",
+            operation_level="view",
+            operator=self.request.auth.name if self.request.auth else None,
+            module_name="库位"
+        )
+
+        response_data = {
+            'timestamp': timezone.now().isoformat(),
+            'summary': {
+                'total_groups': total_groups,
+                'inconsistent_groups': inconsistent_groups,
+                'consistent_groups': total_groups - inconsistent_groups
+            },
+            'data': result_data
+        }
+        return Response(response_data, status=status.HTTP_200_OK)
+
+    @action(methods=['post'], detail=False, url_path='fix-pallet-consistency')
+    def fix_pallet_consistency(self, request):
+        """
+        修复库位组托盘数不一致问题:
+        - 将库位组记录的 current_quantity 校准为实际激活托盘数
+        - 将组内库位的 current_quantity 校准为各自的激活托盘数
+        """
+        if not request.auth:
+            return Response(
+                {'code': '401', 'message': '未授权访问', 'data': None},
+                status=status.HTTP_401_UNAUTHORIZED
+            )
+
+        group_codes = request.data.get('group_codes')
+        warehouse_code = request.data.get('warehouse_code')
+        group_code_filter = None
+        if isinstance(group_codes, (list, tuple, set)):
+            group_code_filter = [code for code in group_codes if code]
+
+        layer_param = request.data.get('layer')
+
+        filters = {'is_active': True}
+        if warehouse_code:
+            filters['warehouse_code'] = warehouse_code
+        if layer_param is not None:
+            try:
+                filters['layer'] = int(layer_param)
+            except (TypeError, ValueError):
+                pass
+        if group_code_filter:
+            filters['group_code__in'] = group_code_filter
+
+        prefetch_active_links = Prefetch(
+            'location_items',
+            queryset=LocationModel.objects.prefetch_related(
+                Prefetch(
+                    'container_links',
+                    queryset=LocationContainerLink.objects.filter(is_active=True),
+                    to_attr='active_links'
+                )
+            ),
+            to_attr='prefetched_locations'
+        )
+
+        annotated_groups = list(
+            LocationGroupModel.objects.filter(**filters)
+            .annotate(
+                active_pallets=Count(
+                    'location_items__container_links',
+                    filter=Q(location_items__container_links__is_active=True),
+                    distinct=True,
+                )
+            )
+            .values('id', 'group_code', 'active_pallets')
+        )
+
+        if not annotated_groups:
+            return Response(
+                {
+                    'timestamp': timezone.now().isoformat(),
+                    'summary': {
+                        'total_groups': 0,
+                        'processed_groups': 0,
+                        'fixed_groups': 0,
+                        'fixed_locations': 0,
+                        'skipped_groups': 0,
+                    },
+                    'details': {
+                        'fixed_groups': [],
+                        'fixed_locations': [],
+                        'skipped_groups': [],
+                    }
+                },
+                status=status.HTTP_200_OK
+            )
+
+        group_stats_map = {
+            item['id']: {
+                'group_code': item['group_code'],
+                'active_pallets': item.get('active_pallets') or 0,
+            }
+            for item in annotated_groups
+        }
+        group_ids = list(group_stats_map.keys())
+
+        groups_qs = LocationGroupModel.objects.filter(id__in=group_ids).prefetch_related(prefetch_active_links)
+
+        total_groups = len(group_ids)
+
+        fixed_groups = []
+        fixed_locations = []
+        skipped_groups = []
+        processed_groups = 0
+
+        try:
+            with transaction.atomic():
+                for group in groups_qs.select_for_update():
+                    stats = group_stats_map.get(group.id, {})
+                    actual_quantity = stats.get('active_pallets', 0)
+                    group_code = stats.get('group_code') or group.group_code
+                    processed_groups += 1
+                    recorded_quantity = group.current_quantity or 0
+                    if recorded_quantity != actual_quantity:
+                        old_quantity = recorded_quantity
+                        group.current_quantity = actual_quantity
+                        group.save(update_fields=['current_quantity'])
+                        fixed_groups.append({
+                            'group_id': group.id,
+                            'group_code': group_code,
+                            'old_quantity': old_quantity,
+                            'new_quantity': actual_quantity,
+                            'difference': actual_quantity - old_quantity,
+                        })
+
+                        locations = getattr(group, 'prefetched_locations', [])
+                        for location in locations:
+                            active_links = getattr(location, 'active_links', [])
+                            active_count = len(active_links)
+                            recorded_loc_qty = location.current_quantity or 0
+                            if recorded_loc_qty != active_count:
+                                old_loc_qty = recorded_loc_qty
+                                LocationModel.objects.filter(pk=location.id).update(
+                                    current_quantity=active_count,
+                                    update_time=timezone.now()
+                                )
+                                fixed_locations.append({
+                                    'location_id': location.id,
+                                    'location_code': location.location_code,
+                                    'group_code': group_code,
+                                    'old_quantity': old_loc_qty,
+                                    'new_quantity': active_count,
+                                    'difference': active_count - old_loc_qty,
+                                })
+                    else:
+                        skipped_groups.append({
+                            'group_id': group.id,
+                            'group_code': group_code,
+                            'recorded_quantity': recorded_quantity,
+                            'actual_quantity': actual_quantity,
+                        })
+
+            summary = {
+                'total_groups': total_groups,
+                'processed_groups': processed_groups,
+                'fixed_groups': len(fixed_groups),
+                'fixed_locations': len(fixed_locations),
+                'skipped_groups': len(skipped_groups),
+            }
+
+            log_operation(
+                request=self.request,
+                operation_content=(
+                    f"执行托盘数修复:共处理 {processed_groups} 个库位组,"
+                    f"修复 {len(fixed_groups)} 个库位组,调整 {len(fixed_locations)} 个库位"
+                ),
+                operation_level="update",
+                operator=self.request.auth.name if self.request.auth else None,
+                module_name="库位"
+            )
+
+            return Response(
+                {
+                    'timestamp': timezone.now().isoformat(),
+                    'summary': summary,
+                    'details': {
+                        'fixed_groups': fixed_groups,
+                        'fixed_locations': fixed_locations,
+                        'skipped_groups': skipped_groups,
+                    }
+                },
+                status=status.HTTP_200_OK
+            )
+
+        except Exception as exc:
+            log_failure_operation(
+                request=self.request,
+                operation_content=f"托盘数修复失败: {str(exc)}",
+                operation_level="update",
+                operator=self.request.auth.name if self.request.auth else None,
+                module_name="库位"
+            )
+            raise
+
 class LocationAllocation:
     # 入库规则函数
     # fun:get_pallet_count_by_batch: 根据托盘码查询批次下托盘总数

+ 14 - 2
container/views.py

@@ -2351,14 +2351,16 @@ class OutboundService:
         max_tasks = 2
         skip_count = 0
         max_skip = 5  # 最多跳过5个任务,避免无限循环
+        dispatched_ids = set()
         
         while processed_count < max_tasks and skip_count < max_skip:
             # 重新获取待处理任务(因为可能有任务被跳过)
-            pending_tasks = get_pending_tasks()
+            pending_tasks = get_pending_tasks().exclude(pk__in=dispatched_ids)
             if not pending_tasks.exists():
                 break
             
             next_task = pending_tasks.first()
+            dispatched_ids.add(next_task.pk)
             location = next_task.current_location
             
             if location == '103' or location == '203':
@@ -2372,8 +2374,18 @@ class OutboundService:
             
             try:
                 allocator = LocationAllocation()
-                OutboundService.perform_initial_allocation(allocator, next_task.current_location)
+                allocation_success = OutboundService.perform_initial_allocation(
+                    allocator,
+                    next_task.current_location
+                )
+                if not allocation_success:
+                    logger.warning(f"任务分配失败,跳过: {next_task.taskid}")
+                    skip_count += 1
+                    continue
                 OutboundService.send_task_to_wcs(next_task)
+                # 标记任务为已下发,避免重复下发
+                next_task.status = 150
+                next_task.save(update_fields=['status'])
                 processed_count += 1
                 logger.info(f"成功下发任务: {next_task.taskid}, 批次: {next_task.batch_out_id if next_task.batch_out else '无批次'}")
             except Exception as e:

+ 0 - 1
templates/dist/spa/css/10.009f6600.css

@@ -1 +0,0 @@
-.q-date__calendar-item--selected[data-v-96afaa0a]{transition:all 0.3s ease;background-color:#1976d2!important}.q-date__range[data-v-96afaa0a]{background-color:rgba(25,118,210,0.1)}.custom-title[data-v-96afaa0a]{font-size:0.9rem;font-weight:500}.custom-timeline[data-v-96afaa0a]{--q-timeline-color:#e0e0e0}.custom-node .q-timeline__dot[data-v-96afaa0a]{background:#485573!important;border:2px solid #5c6b8c!important}.custom-node .q-timeline__content[data-v-96afaa0a]{color:#485573}

+ 1 - 0
templates/dist/spa/css/10.d66de84e.css

@@ -0,0 +1 @@
+.q-date__calendar-item--selected[data-v-655448f2]{transition:all 0.3s ease;background-color:#1976d2!important}.q-date__range[data-v-655448f2]{background-color:rgba(25,118,210,0.1)}.custom-title[data-v-655448f2]{font-size:0.9rem;font-weight:500}.custom-timeline[data-v-655448f2]{--q-timeline-color:#e0e0e0}.custom-node .q-timeline__dot[data-v-655448f2]{background:#485573!important;border:2px solid #5c6b8c!important}.custom-node .q-timeline__content[data-v-655448f2]{color:#485573}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 1
templates/dist/spa/css/3.98304b39.css


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
templates/dist/spa/css/3.bfd66d46.css


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 1
templates/dist/spa/css/34.0d4c4716.css


templates/dist/spa/css/35.5557cd4a.css → templates/dist/spa/css/34.5557cd4a.css


templates/dist/spa/css/36.8f3f6188.css → templates/dist/spa/css/35.8f3f6188.css


templates/dist/spa/css/37.44ddcebd.css → templates/dist/spa/css/36.44ddcebd.css


templates/dist/spa/css/38.2ac1dad1.css → templates/dist/spa/css/37.2ac1dad1.css


templates/dist/spa/css/39.12670fd1.css → templates/dist/spa/css/38.12670fd1.css


templates/dist/spa/css/40.9478c981.css → templates/dist/spa/css/39.9478c981.css


+ 0 - 1
templates/dist/spa/css/4.1df4ea51.css

@@ -1 +0,0 @@
-.q-date__calendar-item--selected[data-v-b05782d8]{transition:all 0.3s ease;background-color:#1976d2!important}.q-date__range[data-v-b05782d8]{background-color:rgba(25,118,210,0.1)}.custom-title[data-v-b05782d8]{font-size:0.9rem;font-weight:500}.custom-timeline[data-v-b05782d8]{--q-timeline-color:#e0e0e0}.custom-node .q-timeline__dot[data-v-b05782d8]{background:#485573!important;border:2px solid #5c6b8c!important}.custom-node .q-timeline__content[data-v-b05782d8]{color:#485573}

+ 1 - 0
templates/dist/spa/css/4.66ad7197.css

@@ -0,0 +1 @@
+.q-date__calendar-item--selected[data-v-8dee4bfc]{transition:all 0.3s ease;background-color:#1976d2!important}.q-date__range[data-v-8dee4bfc]{background-color:rgba(25,118,210,0.1)}.custom-title[data-v-8dee4bfc]{font-size:0.9rem;font-weight:500}.custom-timeline[data-v-8dee4bfc]{--q-timeline-color:#e0e0e0}.custom-node .q-timeline__dot[data-v-8dee4bfc]{background:#485573!important;border:2px solid #5c6b8c!important}.custom-node .q-timeline__content[data-v-8dee4bfc]{color:#485573}

templates/dist/spa/css/41.c4652654.css → templates/dist/spa/css/40.c4652654.css


templates/dist/spa/css/42.7a23b7fb.css → templates/dist/spa/css/41.7a23b7fb.css


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
templates/dist/spa/css/42.07732723.css


+ 0 - 1
templates/dist/spa/css/chunk-common.ab88e7ab.css

@@ -1 +0,0 @@
-[data-v-1c8c3736] .q-field__label{margin-top:8px;align-self:center}[data-v-1c8c3736] .q-field__control-container{padding-left:50px;margin-top:-5px}[data-v-1c8c3736] .q-table .q-editable:hover{background-color:#f0f8ff;cursor:pointer}[data-v-1c8c3736] .q-field__native{padding:5px 8px}[data-v-1c8c3736] .q-table tr.editing{background-color:#e8f5e9!important}

+ 1 - 0
templates/dist/spa/css/chunk-common.e7ea1610.css

@@ -0,0 +1 @@
+[data-v-e67ff212] .q-field__label{margin-top:8px;align-self:center}[data-v-e67ff212] .q-field__control-container{padding-left:50px;margin-top:-5px}[data-v-e67ff212] .q-table .q-editable:hover{background-color:#f0f8ff;cursor:pointer}[data-v-e67ff212] .q-field__native{padding:5px 8px}[data-v-e67ff212] .q-table tr.editing{background-color:#e8f5e9!important}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
templates/dist/spa/index.html


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 1
templates/dist/spa/js/10.6404af04.js


BIN
templates/dist/spa/js/10.6404af04.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
templates/dist/spa/js/10.7083f21f.js


BIN
templates/dist/spa/js/10.7083f21f.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 1
templates/dist/spa/js/3.4366e891.js


BIN
templates/dist/spa/js/3.4366e891.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
templates/dist/spa/js/3.d2c5199b.js


BIN
templates/dist/spa/js/3.d2c5199b.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
templates/dist/spa/js/35.08b4d310.js


BIN
templates/dist/spa/js/35.08b4d310.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 1
templates/dist/spa/js/34.fe660215.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
templates/dist/spa/js/36.0ef8719a.js


BIN
templates/dist/spa/js/35.73cf8fc6.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
templates/dist/spa/js/37.faa1b078.js


BIN
templates/dist/spa/js/37.faa1b078.js.gz


BIN
templates/dist/spa/js/36.0ef8719a.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
templates/dist/spa/js/38.51ed54fd.js


BIN
templates/dist/spa/js/37.54c90e2b.js.gz


BIN
templates/dist/spa/js/38.51ed54fd.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
templates/dist/spa/js/39.d57f53e6.js


BIN
templates/dist/spa/js/39.d57f53e6.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
templates/dist/spa/js/40.0df87f4e.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 1
templates/dist/spa/js/4.08fdf7c6.js


BIN
templates/dist/spa/js/4.08fdf7c6.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
templates/dist/spa/js/4.4b393725.js


BIN
templates/dist/spa/js/4.4b393725.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
templates/dist/spa/js/41.0f33ab80.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
templates/dist/spa/js/42.f341b76d.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
templates/dist/spa/js/42.95116c09.js


BIN
templates/dist/spa/js/42.95116c09.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
templates/dist/spa/js/app.805f1cc7.js


BIN
templates/dist/spa/js/app.2dbb2966.js.gz


BIN
templates/dist/spa/js/app.805f1cc7.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
templates/dist/spa/js/chunk-common.82036531.js


BIN
templates/dist/spa/js/chunk-common.82036531.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 1
templates/dist/spa/js/chunk-common.9aae00f4.js


BIN
templates/dist/spa/js/chunk-common.9aae00f4.js.gz


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
templates/dist/spa/js/vendor.1ba90913.js


BIN
templates/dist/spa/js/vendor.1ba90913.js.gz


+ 1 - 8
templates/src/pages/stock/management.vue

@@ -338,14 +338,7 @@
                     {{ stats.statistic_time_display || "-" }}
                   </div>
                   <div class="action-buttons q-mt-sm">
-                    <q-btn
-                      icon="refresh"
-                      label="刷新统计"
-                      @click="getStatistics()"
-                      flat
-                      dense
-                      class="full-width q-mb-sm"
-                    />
+    
                     <q-btn
                       icon="verified"
                       :label="$t('validate') || '数据校验'"

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1280 - 124
templates/src/pages/stock/stockbinlist.vue