From ee9fce675deac32a42500f6775365a73e2910dfb Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 18 Aug 2025 11:04:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AF=BC=E5=85=A5=E5=87=BA=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E6=98=8E=E7=BB=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/services_daoru.py | 35 ++++++++++++++++++-- apps/inm/views.py | 10 +++++- media/default/template/出入库明细.xlsx | Bin 0 -> 10401 bytes 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 media/default/template/出入库明细.xlsx diff --git a/apps/inm/services_daoru.py b/apps/inm/services_daoru.py index 3f3f59c1..f4ea563a 100644 --- a/apps/inm/services_daoru.py +++ b/apps/inm/services_daoru.py @@ -1,6 +1,6 @@ from rest_framework.exceptions import ParseError from apps.mtm.models import Process, Material -from apps.inm.models import WareHouse, MaterialBatch, MIOItem, MIOItemw +from apps.inm.models import WareHouse, MaterialBatch, MIOItem, MIOItemw, MIO from apps.utils.tools import ranstr from apps.mtm.services_2 import cal_material_count @@ -123,4 +123,35 @@ def daoru_mioitem_test(path:str, mioitem:MIOItem): ftestitems.append(FtestItem(ftest=ftest, testitem=t_list[6], test_val_json=sheet[f"k{i}"].value, test_user=test_user, id=idWorker.get_id())) FtestItem.objects.bulk_create(ftestitems) else: - break \ No newline at end of file + break + + +def daoru_mioitems(path:str, mio:MIO): + from apps.utils.snowflake import idWorker + from openpyxl import load_workbook + + wb = load_workbook(path, data_only=True) + if "Sheet1" in wb.sheetnames: # 检查是否存在 + sheet = wb["Sheet1"] # 获取工作表 + else: + raise ParseError("未找到Sheet1") + + mioitems = [] + ind = 2 + while sheet[f"b{ind}"].value: + batch = sheet[f"b{ind}"].value + material_number = sheet[f"a{ind}"].value + try: + material = Material.objects.get(number=material_number) + except Exception as e: + raise ParseError(f"未找到物料:{material_number} {e}") + count = sheet[f"c{ind}"].value + warehouse_name = sheet[f"d{ind}"].value + try: + warehouse = WareHouse.objects.get(name=warehouse_name) + except Exception as e: + raise ParseError(f"未找到仓库:{warehouse_name} {e}") + mioitems.append(MIOItem(mio=mio, warehouse=warehouse, material=material, batch=batch, count=count, id=idWorker.get_id())) + ind = ind + 1 + + MIOItem.objects.bulk_create(mioitems) \ No newline at end of file diff --git a/apps/inm/views.py b/apps/inm/views.py index 3300dccc..2fc2fe18 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -18,7 +18,7 @@ from apps.inm.serializers import ( from apps.inm.serializers2 import MIOItemwCreateUpdateSerializer from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.inm.services import InmService -from apps.inm.services_daoru import daoru_mb, daoru_mioitem_test +from apps.inm.services_daoru import daoru_mb, daoru_mioitem_test, daoru_mioitems as d_mioitems from apps.utils.mixins import (BulkCreateModelMixin, BulkDestroyModelMixin, BulkUpdateModelMixin, CustomListModelMixin) from apps.utils.permission import has_perm @@ -262,6 +262,14 @@ class MIOViewSet(CustomModelViewSet): mioitem.save(update_fields=['pack_index', 'update_time']) return Response() + @action(methods=['post'], detail=True, perms_map={'post': 'mio.update'}, serializer_class=serializers.Serializer) + def daoru_mioitems(self, request, *args, **kwargs): + """导入明细 + + 导入明细 + """ + d_mioitems(settings.BASE_DIR + request.data.get('path', '')) + return Response() class PackViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin, CustomGenericViewSet): """ list: 装箱记录 diff --git a/media/default/template/出入库明细.xlsx b/media/default/template/出入库明细.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f7e526e6eef0149e3192c2ebd7529e207a337cf2 GIT binary patch literal 10401 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 P&@qt!lKJx0BlrIY>x|cC literal 0 HcmV?d00001