فهرست منبع

库位分配bug修改:2库位不足,分到4库位

flower_mr 1 هفته پیش
والد
کامیت
10af68b2f8

+ 19 - 2
bin/algorithms.py

@@ -23,7 +23,11 @@ class AllocationAlgorithm:
                 candidates = sorted(
                     [(t, c) for t, c in cls.CAPACITY_MAP.items()
                      if layer_state[layer_idx].get(t, 0) > 0],
-                    key=lambda x: (abs(x[1]-remain), -x[1])
+                    key=lambda x: (
+                        0 if x[1] == remain else 1,
+                        0 if x[1] > remain else 1,
+                        x[1] if x[1] > remain else -x[1],
+                    )
                 )
 
                 for loc_type, cap in candidates:
@@ -104,4 +108,17 @@ class AllocationAlgorithm:
                             + f"{int(location_list_cnumber.col):02d}" + '-' 
                             + f"{int(location_list_cnumber.layer):02d}" 
                         )
-        return allocation_target_location
+        return allocation_target_location
+    
+    def generate_WMS_location(location):
+        # location = 'SZ-01-01-01'
+        # if location == '203':
+        #     warehouse_code
+        # elif location == '103':
+        #     return 'SZ-01-01-02'
+        # else:
+            
+        warehouse_code, row, col, layer = location.split('-')
+        from .models import LocationModel
+        location_obj = LocationModel.objects.filter(warehouse_code=warehouse_code, row=row, col=col, layer=layer).first()
+        return location_obj

+ 0 - 0
bin/generate_wcs_task.py


+ 7 - 4
bin/models.py

@@ -73,10 +73,13 @@ class LocationModel(models.Model):
         )
 
     def get_active_containers(self):
-        return self.current_containers.filter(
-            available=True
-        )
-
+        """获取当前有效的容器列表"""
+        from .models import LocationContainerLink
+        active_links = LocationContainerLink.objects.filter(
+            location=self,
+            is_active=True
+        ).select_related('container')  # 优化查询
+        return [link.container for link in active_links]  # 返回容器列表
 
     @classmethod
     def generate_locations(cls, warehouse_code):

+ 7 - 1
bin/queries.py

@@ -243,9 +243,15 @@ class LocationQueries:
         获取指定批次的剩余库位
         :param batch_number: 批次号
         :return: 剩余库位
+        x ('available', '可用'),
+        ('occupied', '占用'),
+        x ('full', '满'),
+        x ('disabled', '禁用'),
+        ('reserved', '预留'),
+        x ('maintenance', '维护中')
         """
         layer_solution_type =[]
-        location_group_obj =LocationGroupModel.objects.filter(current_batch=batch_number,status='occupied').all()
+        location_group_obj =LocationGroupModel.objects.filter(current_batch=batch_number).all().exclude(status=['available','full','disabled','maintenance'])
         if not location_group_obj:
             return None
         else:

+ 76 - 1
bin/services.py

@@ -194,6 +194,57 @@ class AllocationService:
        
         return location_min_value,allocation_target_location, batch_info
 
+    @classmethod
+    def _move_allocation(cls, start_point,target_point,container_code):
+        batch_info = LocationQueries.get_batch_info(container_code)
+        start_location = AllocationAlgorithm.generate_WMS_location(start_point)
+        target_location = AllocationAlgorithm.generate_WMS_location(target_point)
+        if not start_location or not target_location:
+            raise ValueError("无效的起始或目标位置")
+        if start_location.location_code == target_location.location_code:
+            raise ValueError("起始位置与目标位置相同")  
+        
+        location_min_value = AllocationService.get_location_group_remainder(target_location.location_group)
+        if not location_min_value:
+            raise ValueError("[1] 任务分配失败,无可用库位")
+        print(f"[1] 任务安排到第{location_min_value.c_number}个库位:{location_min_value}")
+        start_location.status = 'available'
+        start_location.save()
+    
+        location_min_value.status = 'occupied'
+        location_min_value.save()
+        print(f"[2] 库位状态更新成功!")
+
+        update_location_group_status=LocationUpdates.update_location_group_status(location_min_value.location_code)
+        update_start_location_group_status= LocationUpdates.update_location_group_status(start_location.location_code)    
+        if not update_location_group_status or not update_start_location_group_status:
+            raise ValueError("[3] 库位组状态更新失败")
+        print(f"[3] 库位组状态更新成功!")
+
+        # update_batch_status = LocationUpdates.update_batch_status(container_code, 2)
+        # if not update_batch_status:
+        #     raise ValueError("[4] 批次状态更新失败")
+        # print(f"[4] 批次状态更新成功!")
+
+        update_location_group_batch = LocationUpdates.update_location_group_batch(location_min_value,batch_info['number'])
+        if not update_location_group_batch:
+            raise ValueError("[5] 批次信息更新失败")
+        print(f"[5] 批次信息更新成功!")
+
+        update_location_container_link = LocationUpdates.link_container(location_min_value.location_code, container_code)
+        if not update_location_container_link:
+            raise ValueError("[6] 容器与库位关联失败")
+        print(f"[6] 容器与库位关联成功!")
+ 
+        update_location_container_detail = LocationUpdates.update_container_detail_status(container_code, 2)
+        if not update_location_container_detail:
+            raise ValueError("[7] 托盘详情状态更新失败")
+        print(f"[7] 托盘详情状态更新成功!")
+
+        allocation_target_location = AllocationAlgorithm.generate_WCS_location(location_min_value)
+  
+        return location_min_value,allocation_target_location, batch_info
+
     @classmethod
     def _subsequent_allocation(cls, container_code, batch_info, start_point):
 
@@ -266,4 +317,28 @@ class AllocationService:
                 # 更新任务完成数目
                 current_task[layer] = current_task[layer] + 1
                 LocationUpdates.update_current_finish_task(container_code,current_task)
-                return location_list[0]
+                return location_list[0]
+            
+    @transaction.atomic
+    def get_location_group_remainder(location_group_code):
+        """
+        获取可用库位的c_number列表
+        :param location_group: 库位组
+                        :return: 可用库位编号列表
+        """
+        location_group = LocationGroupModel.objects.filter(
+            group_code = location_group_code,
+        ).first()
+        if not location_group:
+            return None
+        location_list = location_group.location_items.filter(
+            status='available'
+        ).all().order_by('c_number')
+        if not location_list:
+            print(f"当前层库位组 {location_group.group_code} 可用库位: None")
+         
+        # 提取所有库位的 c_number
+        c_numbers = [loc.c_number for loc in location_list]
+        print(f"当前层库位组 {location_group.group_code} 可用库位: {c_numbers}")
+
+        return location_list[0]

+ 1 - 1
bin/updates.py

@@ -134,7 +134,7 @@ class LocationUpdates:
     
     @staticmethod
     @transaction.atomic
-    def update_location_group_status( location_code):
+    def update_location_group_status(location_code):
         """
         更新库位组状态
         :param location_code: 库位编码

+ 37 - 37
bin/views.py

@@ -67,7 +67,7 @@ class locationViewSet(viewsets.ModelViewSet):
             is_active=True
         ).select_related('container'),  # 加载关联的容器对象
         to_attr='active_links'  # 新的属性名称
-    )
+        )
 
         if self.request.user:
             if id is None:
@@ -532,42 +532,42 @@ class LocationAllocation:
             print(f"更新批次状态失败:{str(e)}")
             return False  
         
-    def update_batch_goods_in_location_qty(self,container_code,taskworking):
-        """
-        更新批次库位入库数量
-        :param container_code: 托盘码
-        :param goods_in_location_qty: 库位入库数量
-        :return:
-        """
-        try:
-            # 1. 通过托盘码获取托盘详情
-            container = ContainerListModel.objects.filter(
-                container_code=container_code
-            ).first()
-
-            if not container:
-                logger.error(f"托盘 {container_code} 不存在")
-                print(f"托盘 {container_code} 不存在")
-                return None
-            # 2. 获取关联的批次明细
-            container_detail = ContainerDetailModel.objects.filter(
-                container=container.id,is_delete=False
-            ).exclude(status=3).all()
-            if not container_detail:
-                print (f"托盘 {container_code} 未组盘")
-                logger.error(f"托盘 {container_code} 未组盘_from update_batch_goods_in_location_qty")
-                return None
-            for item in container_detail:
-                if item.goods_class == 2:
-                    continue
-                item.batch.goods_in_location_qty += item.goods_qty * taskworking
-                item.batch.save()
-                print(f"更新批次库位入库数量成功!")
-            return True
-        except Exception as e:       
-            logger.error(f"更新批次库位入库数量失败:{str(e)}")
-            print(f"更新批次库位入库数量失败:{str(e)}")
-            return False  
+    # def update_batch_goods_in_location_qty(self,container_code,taskworking):
+    #     """
+    #     更新批次库位入库数量
+    #     :param container_code: 托盘码
+    #     :param goods_in_location_qty: 库位入库数量
+    #     :return:
+    #     """
+    #     try:
+    #         # 1. 通过托盘码获取托盘详情
+    #         container = ContainerListModel.objects.filter(
+    #             container_code=container_code
+    #         ).first()
+
+    #         if not container:
+    #             logger.error(f"托盘 {container_code} 不存在")
+    #             print(f"托盘 {container_code} 不存在")
+    #             return None
+    #         # 2. 获取关联的批次明细
+    #         container_detail = ContainerDetailModel.objects.filter(
+    #             container=container.id,is_delete=False
+    #         ).exclude(status=3).all()
+    #         if not container_detail:
+    #             print (f"托盘 {container_code} 未组盘")
+    #             logger.error(f"托盘 {container_code} 未组盘_from update_batch_goods_in_location_qty")
+    #             return None
+    #         for item in container_detail:
+    #             if item.goods_class == 2:
+    #                 continue
+    #             item.batch.goods_in_location_qty += item.goods_qty * taskworking
+    #             item.batch.save()
+    #             print(f"更新批次库位入库数量成功!")
+    #         return True
+    #     except Exception as e:       
+    #         logger.error(f"更新批次库位入库数量失败:{str(e)}")
+    #         print(f"更新批次库位入库数量失败:{str(e)}")
+    #         return False  
 
 
     

+ 0 - 3
bound/urls.py

@@ -46,9 +46,6 @@ re_path(r'^batch/(?P<pk>\d+)/$', views.BoundBatchViewSet.as_view({
 
 path(r'outdemand/', views.OutBoundDemandViewSet.as_view({"put": "batch_list", "post": "create", "get": "list" }), name="outboundbatchcontainer"), 
 path(r'batchdemand/', views.OutBoundDemandViewSet.as_view({ "post": "distribute", "put": "batch_demanded_list" }), name="outboundbatchcontainer"), 
-
-
-
 path(r'outbatch/', views.OutBoundBatchViewSet.as_view({"get": "list", "post": "create" }), name="outboundbatch"), 
 
 re_path(r'^outbatch/(?P<pk>\d+)/$', views.OutBoundBatchViewSet.as_view({

+ 15 - 6
bound/views.py

@@ -26,6 +26,7 @@ from staff.models import ListModel as staff
 from rest_framework.permissions import AllowAny
 from rest_framework.views import APIView
 
+# 出库需求视图类
 class OutBoundDemandViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -323,7 +324,7 @@ class OutBoundDemandViewSet(viewsets.ModelViewSet):
             "error": error
         }, status=status_code)
 
-
+# 物料统计视图类
 class MaterialStatisticsViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -369,9 +370,8 @@ class MaterialStatisticsViewSet(viewsets.ModelViewSet):
             return MaterialStatisticsSerializer_items
         else:
             return self.http_method_not_allowed(request=self.request)
-        
-    
 
+# 汇报单类视图
 class BoundListViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -470,6 +470,8 @@ class BoundListViewSet(viewsets.ModelViewSet):
             serializer = self.get_serializer(qs, many=False)
             headers = self.get_success_headers(serializer.data)
             return Response(serializer.data, status=200, headers=headers)
+
+# 入库批次类视图
 class BoundBatchViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -595,7 +597,8 @@ class BoundBatchViewSet(viewsets.ModelViewSet):
             serializer = self.get_serializer(qs, many=False)
             headers = self.get_success_headers(serializer.data)
             return Response(serializer.data, status=200, headers=headers)
-      
+
+# 入库明细类视图      
 class BoundDetailViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -680,6 +683,7 @@ class BoundDetailViewSet(viewsets.ModelViewSet):
             headers = self.get_success_headers(serializer.data)
             return Response(serializer.data, status=200, headers=headers)
 
+# 出库明细类视图      
 class OutBoundDetailViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -762,6 +766,7 @@ class OutBoundDetailViewSet(viewsets.ModelViewSet):
             headers = self.get_success_headers(serializer.data)
             return Response(serializer.data, status=200, headers=headers)       
 
+# 出库批次类视图      
 class OutBoundBatchViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -811,6 +816,8 @@ class OutBoundBatchViewSet(viewsets.ModelViewSet):
         if batch_obj is None:
             raise APIException({"detail": "批次不存在"})
 
+        bound_obj = BoundListModel.objects.get(id=data['bound_list_id'])
+        data['bound_list'] = bound_obj.id
         data['batch_number'] = batch_obj.id
         data['out_date'] = str(timezone.now().strftime('%Y-%m-%d %H:%M:%S'))
 
@@ -881,6 +888,8 @@ class OutBoundBatchViewSet(viewsets.ModelViewSet):
         # 创建日志记录
         BatchLogModel.objects.create(**log_data)
         return True 
+
+# 批次操作日志类视图      
 class BoundBatchLogViewSet(viewsets.ModelViewSet):
     
     """
@@ -918,12 +927,12 @@ class BoundBatchLogViewSet(viewsets.ModelViewSet):
         headers = self.get_success_headers(serializer.data)
         return Response(serializer.data, status=200, headers=headers)  
 
-
+# 托盘类视图      
 class BatchContainerAPIView(APIView):
     """
         post:
             返回批次对应的container列表
-            """
+    """
     # authentication_classes = []  # 禁用所有认证类
     # permission_classes = [AllowAny]  # 允许任意访问
     def post(self, request):

+ 21 - 14
container/views.py

@@ -33,6 +33,7 @@ from django.db import close_old_connections
 from bin.services import AllocationService
 from collections import defaultdict
 logger = logging.getLogger(__name__)
+# 托盘列表视图
 class ContainerListViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -109,6 +110,7 @@ class ContainerListViewSet(viewsets.ModelViewSet):
         headers = self.get_success_headers(serializer.data)
         return Response(serializer.data, status=200, headers=headers)
 
+# wcs任务视图
 class WCSTaskViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -152,8 +154,7 @@ class WCSTaskViewSet(viewsets.ModelViewSet):
         else:
             return self.http_method_not_allowed(request=self.request)
 
-
-
+# 入库任务视图
 class TaskViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -211,6 +212,8 @@ class TaskViewSet(viewsets.ModelViewSet):
         headers = self.get_success_headers(serializer.data)
         return Response(serializer.data, status=200, headers=headers)
 
+
+# 任务回滚
 class TaskRollbackMixin:
     @transaction.atomic
     def rollback_task(self, request, task_id, *args, **kwargs):
@@ -292,6 +295,7 @@ class TaskRollbackMixin:
                 status=status.HTTP_500_INTERNAL_SERVER_ERROR
             )
 
+# 入库任务下发
 class ContainerWCSViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -590,9 +594,9 @@ class ContainerWCSViewSet(viewsets.ModelViewSet):
         logger.info(f"托盘 {container_obj.container_code} 已在目标位置")
         task = self.get_task_by_tasknumber(data)
         self.update_pressure_values(task, container_obj)
-        if task.working == 1:
-            alloca = LocationAllocation()
-            alloca.update_batch_goods_in_location_qty(container_obj.container_code, 1)
+        # if task.working == 1:
+        #     alloca = LocationAllocation()
+        #     alloca.update_batch_goods_in_location_qty(container_obj.container_code, 1)
         task = self.process_task_completion(data)
         if not task:
             return Response({'code': '400', 'message': '任务不存在', 'data': data},
@@ -636,7 +640,7 @@ class ContainerWCSViewSet(viewsets.ModelViewSet):
 
     def update_pressure_values(self, task, container_obj):
         """更新压力值计算"""
-        if task and task.tasktype in ['inbound']:
+        if task :
             base_location_obj = base_location.objects.get(id=1)
             layer = int(container_obj.target_location.split('-')[-1])
             pressure_field = f"layer{layer}_pressure"
@@ -1060,7 +1064,7 @@ class ContainerDetailViewSet(viewsets.ModelViewSet):
                 status=status.HTTP_500_INTERNAL_SERVER_ERROR
             )
 
-
+# 托盘操作历史记录
 class ContainerOperateViewSet(viewsets.ModelViewSet):
     """
         retrieve:
@@ -1125,8 +1129,7 @@ class ContainerOperateViewSet(viewsets.ModelViewSet):
         headers = self.get_success_headers(serializer.data)
         return Response(serializer.data, status=200, headers=headers)
     
-    
-
+# 出库任务生成
 class OutboundService:
     @staticmethod
     def generate_task_id():
@@ -1240,7 +1243,7 @@ class OutboundService:
                     batch_out = OutBoundDetail_obj.bound_batch,
                     bound_list = OutBoundDetail_obj.bound_list,
                     sequence=index,
-                    order_number = container['location_c_number'],
+                    order_number = container['c_number'],
                     priority=100,
                     tasknumber = month*100000+tasknumber_index+tasknumber,
                     container=container_obj.container_code,
@@ -1328,6 +1331,8 @@ class OutboundService:
                 return False
         return True
 
+
+# 出库任务下发
 class OutTaskViewSet(APIView):
 
     """
@@ -1519,10 +1524,10 @@ class OutTaskViewSet(APIView):
                     key=lambda x: (
                         self._get_goods_class_priority(x['detail'].goods_class),
                         -(x['location'].c_number if x['location'] else 0),
-                        x['location'].warehouse_code if x['location'] else '',
-                        -(x['location'].layer if x['location'] else 0),
-                        x['location'].row if x['location'] else 0,
-                        x['location'].col if x['location'] else 0
+                     
+                        # -(x['location'].layer if x['location'] else 0),
+                        # x['location'].row if x['location'] else 0,
+                        # x['location'].col if x['location'] else 0
                     )
                 )
                 
@@ -1661,6 +1666,8 @@ class OutTaskViewSet(APIView):
         except Exception as e:
             return {"code": "500", "msg": str(e)}
 
+
+# 出库任务监测
 class BatchViewSet(viewsets.ModelViewSet):
     authentication_classes = []  # 禁用所有认证类
     permission_classes = [AllowAny]  # 允许任意访问

+ 0 - 28
data_base/test_location.py

@@ -1,28 +0,0 @@
-# generate_locations.py
-import os
-import django
-import sys
-
-def setup_django():
-    # 使用原始字符串处理Windows路径
-    project_path = "D:/Document/code/vue/greater_wms"
-    sys.path.append(project_path)
-    # 根据实际目录名设置
-    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'greaterwms.settings')
-    django.setup()
-
-def main():
-
-    from bin.location_allocation import LocationAllocation
-    from bin.exceptions import AllocationError
-    allocator = LocationAllocation()
-
-    try:
-        result = allocator.process('12345')
-        print('result:', result)
-    except AllocationError as e:
-        print('error:', e)
-
-if __name__ == "__main__":
-    setup_django()
-    main()

+ 32 - 0
data_base/test_move.py

@@ -0,0 +1,32 @@
+# generate_locations.py
+import os
+import django
+import sys
+
+def setup_django():
+    # 使用原始字符串处理Windows路径
+    project_path = "D:/Document/code/vue/greater_wms"
+    sys.path.append(project_path)
+    # 根据实际目录名设置
+    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'greaterwms.settings')
+    django.setup()
+
+def main():
+
+    from bin.services import AllocationService
+
+
+    try:
+        # location_min_value,allocation_target_location, batch_info = AllocationService._move_allocation('W01-15-14-01', 'W01-01-02-01', '10043')
+        # location_min_value,allocation_target_location, batch_info = AllocationService._move_allocation('W01-15-15-01', 'W01-01-03-01', '10041')
+        # location_min_value,allocation_target_location, batch_info = AllocationService._move_allocation('W01-15-16-01', 'W01-01-04-01', '10047')
+        location_min_value,allocation_target_location, batch_info = AllocationService._move_allocation('W01-01-07-01', 'W01-01-06-01', '10060')
+        # self.generate_task(container, current_location, allocation_target_location,batch_id,location_min_value.c_number)  # 生成任务
+        # self.generate_container_operate(container_obj, batch_id, allocation_target_location)
+    except Exception as e:
+        print(e)
+
+
+if __name__ == "__main__":
+    setup_django()
+    main()

+ 306 - 0
logs/error.log

@@ -8977,3 +8977,309 @@ NameError: name 'serializer' is not defined
 [2025-05-23 13:15:54,701][django.server.log_message():187] [ERROR] "GET /container/container_wcs/ HTTP/1.1" 500 60
 [2025-05-23 13:26:07,453][django.request.log_response():241] [ERROR] Internal Server Error: /container/container_wcs/
 [2025-05-23 13:26:07,456][django.server.log_message():187] [ERROR] "GET /container/container_wcs/ HTTP/1.1" 500 60
+[2025-05-25 16:32:48,656][django.request.log_response():241] [ERROR] Internal Server Error: /bound/outbatch/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\bound\views.py", line 819, in create
+    bound_obj = BoundListModel.objects.get(id=data['bound_list_id'])
+KeyError: 'bound_list_id'
+[2025-05-25 16:32:48,659][django.server.log_message():187] [ERROR] "POST /bound/outbatch/ HTTP/1.1" 500 112954
+[2025-05-25 16:39:04,668][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+[2025-05-25 16:39:04,669][django.server.log_message():187] [ERROR] "POST /container/out_task/ HTTP/1.1" 500 42
+[2025-05-25 16:55:25,265][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+[2025-05-25 16:55:25,268][django.server.log_message():187] [ERROR] "POST /container/out_task/ HTTP/1.1" 500 42
+[2025-05-25 16:57:43,645][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+[2025-05-25 16:57:43,646][django.server.log_message():187] [ERROR] "POST /container/out_task/ HTTP/1.1" 500 42
+[2025-05-25 16:57:56,023][django.request.log_response():241] [ERROR] Internal Server Error: /container/out_task/
+[2025-05-25 16:57:56,024][django.server.log_message():187] [ERROR] "POST /container/out_task/ HTTP/1.1" 500 42
+[2025-05-25 21:59:04,118][django.request.log_response():241] [ERROR] Internal Server Error: /bound/outbatch/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "D:\Document\code\vue\greater_wms\bound\views.py", line 815, in create
+    batch_obj = BoundBatchModel.objects.get(bound_number=data['out_number'])
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
+    return getattr(self.get_queryset(), name)(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\query.py", line 650, in get
+    raise self.model.DoesNotExist(
+bound.models.BoundBatchModel.DoesNotExist: BoundBatchModel matching query does not exist.
+[2025-05-25 21:59:04,122][django.server.log_message():187] [ERROR] "POST /bound/outbatch/ HTTP/1.1" 500 122846
+[2025-05-26 13:15:56,189][django.request.log_response():241] [ERROR] Internal Server Error: /bin/91/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 56, in retrieve
+    return Response(serializer.data)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 555, in data
+    ret = super().data
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 509, in to_representation
+    attribute = field.get_attribute(instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 446, in get_attribute
+    return get_attribute(instance, self.source_attrs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 101, in get_attribute
+    instance = instance()
+  File "D:\Document\code\vue\greater_wms\bin\models.py", line 76, in get_active_containers
+    return self.current_containers.filter(
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
+    return getattr(self.get_queryset(), name)(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\query.py", line 1420, in filter
+    return self._filter_or_exclude(False, args, kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\query.py", line 1438, in _filter_or_exclude
+    clone._filter_or_exclude_inplace(negate, args, kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\query.py", line 1445, in _filter_or_exclude_inplace
+    self._query.add_q(Q(*args, **kwargs))
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\sql\query.py", line 1532, in add_q
+    clause, _ = self._add_q(q_object, self.used_aliases)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\sql\query.py", line 1562, in _add_q
+    child_clause, needed_inner = self.build_filter(
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\sql\query.py", line 1407, in build_filter
+    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\sql\query.py", line 1217, in solve_lookup_type
+    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\sql\query.py", line 1709, in names_to_path
+    raise FieldError(
+django.core.exceptions.FieldError: Cannot resolve keyword 'is_active' into field. Choices are: allocation_history, available, container_code, current_location, details, id, last_operation, location_links, locationchangelog, locationmodel, operations, status, target_location
+[2025-05-26 13:15:56,193][django.server.log_message():187] [ERROR] "GET /bin/91/ HTTP/1.1" 500 196184
+[2025-05-26 13:17:27,893][django.request.log_response():241] [ERROR] Internal Server Error: /bin/91/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 56, in retrieve
+    return Response(serializer.data)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 555, in data
+    ret = super().data
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 509, in to_representation
+    attribute = field.get_attribute(instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 446, in get_attribute
+    return get_attribute(instance, self.source_attrs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 101, in get_attribute
+    instance = instance()
+  File "D:\Document\code\vue\greater_wms\bin\models.py", line 78, in get_active_containers
+    return LocationContainerLink.objects.filter(
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
+    return getattr(self.get_queryset(), name)(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\query.py", line 1420, in filter
+    return self._filter_or_exclude(False, args, kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\query.py", line 1438, in _filter_or_exclude
+    clone._filter_or_exclude_inplace(negate, args, kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\query.py", line 1445, in _filter_or_exclude_inplace
+    self._query.add_q(Q(*args, **kwargs))
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\sql\query.py", line 1532, in add_q
+    clause, _ = self._add_q(q_object, self.used_aliases)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\sql\query.py", line 1562, in _add_q
+    child_clause, needed_inner = self.build_filter(
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\sql\query.py", line 1478, in build_filter
+    condition = self.build_lookup(lookups, col, value)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\db\models\sql\query.py", line 1292, in build_lookup
+    raise FieldError(
+django.core.exceptions.FieldError: Related Field got invalid lookup: is_active
+[2025-05-26 13:17:27,897][django.server.log_message():187] [ERROR] "GET /bin/91/ HTTP/1.1" 500 198133
+[2025-05-26 13:18:00,752][django.request.log_response():241] [ERROR] Internal Server Error: /bin/88/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 446, in get_attribute
+    return get_attribute(instance, self.source_attrs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 96, in get_attribute
+    instance = getattr(instance, attr)
+AttributeError: 'LocationContainerLink' object has no attribute 'container_code'
+
+During handling of the above exception, another exception occurred:
+
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 56, in retrieve
+    return Response(serializer.data)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 555, in data
+    ret = super().data
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 522, in to_representation
+    ret[field.field_name] = field.to_representation(attribute)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
+    self.child.to_representation(item) for item in iterable
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 509, in to_representation
+    attribute = field.get_attribute(instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 479, in get_attribute
+    raise type(exc)(msg)
+AttributeError: Got AttributeError when attempting to get a value for field `container_code` on serializer `ContainerSimpleSerializer`.
+The serializer field might be named incorrectly and not match any attribute or key on the `LocationContainerLink` instance.
+Original exception text was: 'LocationContainerLink' object has no attribute 'container_code'.
+[2025-05-26 13:18:00,754][django.server.log_message():187] [ERROR] "GET /bin/88/ HTTP/1.1" 500 170439
+[2025-05-26 13:20:26,195][django.request.log_response():241] [ERROR] Internal Server Error: /bin/88/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 101, in get_attribute
+    instance = instance()
+  File "D:\Document\code\vue\greater_wms\bin\models.py", line 84, in get_active_containers
+    return location_links.containers.filter(is_active=True)
+AttributeError: 'LocationContainerLink' object has no attribute 'containers'
+
+During handling of the above exception, another exception occurred:
+
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 56, in retrieve
+    return Response(serializer.data)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 555, in data
+    ret = super().data
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 509, in to_representation
+    attribute = field.get_attribute(instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 446, in get_attribute
+    return get_attribute(instance, self.source_attrs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\fields.py", line 106, in get_attribute
+    raise ValueError('Exception raised in callable attribute "{}"; original exception was: {}'.format(attr, exc))
+ValueError: Exception raised in callable attribute "get_active_containers"; original exception was: 'LocationContainerLink' object has no attribute 'containers'
+[2025-05-26 13:20:26,198][django.server.log_message():187] [ERROR] "GET /bin/88/ HTTP/1.1" 500 157952
+[2025-05-26 13:21:13,256][django.request.log_response():241] [ERROR] Internal Server Error: /bin/88/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 56, in retrieve
+    return Response(serializer.data)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 555, in data
+    ret = super().data
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 522, in to_representation
+    ret[field.field_name] = field.to_representation(attribute)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+TypeError: 'ContainerListModel' object is not iterable
+[2025-05-26 13:21:13,259][django.server.log_message():187] [ERROR] "GET /bin/88/ HTTP/1.1" 500 144425
+[2025-05-26 13:23:03,159][django.request.log_response():241] [ERROR] Internal Server Error: /bin/88/
+Traceback (most recent call last):
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
+    response = get_response(request)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
+    response = wrapped_callback(request, *callback_args, **callback_kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
+    return view_func(*args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
+    return self.dispatch(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
+    response = self.handle_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
+    self.raise_uncaught_exception(exc)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
+    raise exc
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
+    response = handler(request, *args, **kwargs)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\mixins.py", line 56, in retrieve
+    return Response(serializer.data)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 555, in data
+    ret = super().data
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 253, in data
+    self._data = self.to_representation(self.instance)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 522, in to_representation
+    ret[field.field_name] = field.to_representation(attribute)
+  File "d:\Document\code\vue\greater_wms\.venv\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
+    return [
+TypeError: 'ContainerListModel' object is not iterable
+[2025-05-26 13:23:03,164][django.server.log_message():187] [ERROR] "GET /bin/88/ HTTP/1.1" 500 144690

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1603 - 0
logs/server.log


+ 1 - 0
templates/dist/spa/css/15.389bffe6.css

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

+ 0 - 1
templates/dist/spa/css/15.954d38ee.css

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

+ 0 - 1
templates/dist/spa/css/17.44673719.css

@@ -1 +0,0 @@
-.q-date__calendar-item--selected[data-v-9373462c]{transition:all 0.3s ease;background-color:#1976d2!important}.q-date__range[data-v-9373462c]{background-color:rgba(25,118,210,0.1)}[data-v-9373462c] .q-field__label{margin-top:8px;align-self:center}[data-v-9373462c] .q-field__control-container{padding-left:50px;margin-top:-5px}

+ 1 - 0
templates/dist/spa/css/17.c26144d8.css

@@ -0,0 +1 @@
+.q-date__calendar-item--selected[data-v-6bac0e87]{transition:all 0.3s ease;background-color:#1976d2!important}.q-date__range[data-v-6bac0e87]{background-color:rgba(25,118,210,0.1)}[data-v-6bac0e87] .q-field__label{margin-top:8px;align-self:center}[data-v-6bac0e87] .q-field__control-container{padding-left:50px;margin-top:-5px}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
templates/dist/spa/index.html


BIN
templates/dist/spa/js/15.4ac137c7.js.gz


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
templates/dist/spa/js/15.4ac137c7.js


BIN
templates/dist/spa/js/15.b31ffe8b.js.gz


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
templates/dist/spa/js/17.69da295c.js


BIN
templates/dist/spa/js/17.69da295c.js.gz


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 1
templates/dist/spa/js/17.c58c307d.js


BIN
templates/dist/spa/js/17.c58c307d.js.gz


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 1
templates/dist/spa/js/app.251fee65.js


BIN
templates/dist/spa/js/app.251fee65.js.gz


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
templates/dist/spa/js/app.95919fad.js


BIN
templates/dist/spa/js/app.95919fad.js.gz


+ 9 - 2
templates/src/pages/inbound/sortstock.vue

@@ -282,7 +282,7 @@ export default {
           label: "批号",
           field: "bound_batch_order",
           align: "center",
-          sortable:true,
+          sortable: true,
         },
         {
           name: "goods_qty",
@@ -290,12 +290,19 @@ export default {
           field: "goods_qty",
           align: "center",
         },
+
         {
           name: "goods_in_qty",
-          label: "已组盘数目",
+          label: "已入库/组盘数目",
           field: "goods_in_qty",
           align: "center",
         },
+        {
+          name: "goods_out_qty",
+          label: "已出库/预定数目",
+          field: "goods_out_qty",
+          align: "center",
+        },
         {
           name: "goods_std",
           label: "规格型号",

+ 2 - 1
templates/src/pages/outbound/neworder.vue

@@ -968,7 +968,7 @@ export default {
         creater: '',
         out_number: '',
         out_type: '0',
-
+        bound_list_id: 0,
         goods_std: '',
         goods_batch: ''
       },
@@ -1261,6 +1261,7 @@ export default {
       _this.newBatchFormData.openid = _this.openid
       _this.newBatchFormData.warehouse_code = _this.warehouse_code
       _this.newBatchFormData.warehouse_name = _this.warehouse_name
+      _this.newBatchFormData.bound_list_id = _this.detailid
 
       postauth('bound/outbatch/', _this.newBatchFormData)
         .then((res) => {