From 0c1e93bf0b750045fa7ac513b6ef9c6d53aedd2e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 29 Sep 2025 14:50:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0wpr=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpmw/views.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/apps/wpmw/views.py b/apps/wpmw/views.py index 149d1759..3c9a9a59 100644 --- a/apps/wpmw/views.py +++ b/apps/wpmw/views.py @@ -10,6 +10,7 @@ from rest_framework.exceptions import ParseError from django.db import transaction from apps.wpmw.filters import WprFilter from apps.utils.sql import query_one_dict +from django.db.models.expressions import RawSQL class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, CustomGenericViewSet): @@ -17,6 +18,7 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu 动态产品 """ + perms_map = {"get": "*"} select_related_fields = ["wm", "mb", "material", "wm__material_ofrom"] prefetch_related_fields = ["defects"] @@ -27,6 +29,10 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu ordering = ["number", "create_time"] ordering_fields = ["number", "create_time", "update_time"] search_fields = ["number", "material__name", "material__model", "material__specification", "number_out"] + annotate_dict = { + "number_prefix": RawSQL("regexp_replace(number, '(\\d+)$', '')", []), + "number_suffix": RawSQL("COALESCE(NULLIF(regexp_replace(number, '.*?(\\d+)$', '\\1'), ''), '0')::bigint", []), + } def filter_queryset(self, queryset): qs = super().filter_queryset(queryset) @@ -36,7 +42,7 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu qs.exclude(mb=None, wm=None) return qs - @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WprNewSerializer) + @action(methods=["post"], detail=False, perms_map={"post": "*"}, serializer_class=WprNewSerializer) def new_number(self, request, *args, **kwargs): """获取新的编号""" data = request.data @@ -47,16 +53,17 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu wpr_last = wps_qs.order_by("number").last() count = wps_qs.count() last_number = wpr_last.number if count > 0 else None - last_number_count = int(last_number.split("-")[-1].lstrip('0')) + last_number_count = int(last_number.split("-")[-1].lstrip("0")) mat = Material.objects.get(id=material_start) - return Response({"count": count, "last_number": last_number, "material_model":mat.model, "last_number_count": last_number_count}) - - @action(methods=['get'], detail=False, perms_map={'get': '*'}) + return Response({"count": count, "last_number": last_number, "material_model": mat.model, "last_number_count": last_number_count}) + + @action(methods=["get"], detail=False, perms_map={"get": "*"}) def number_out_last(self, request, *args, **kwargs): """获取最新的出库对外编号 - + 获取最新的出库对外编号(get请求传入prefix参数和with_unsubmit参数,with_unsubmit默认为yes,表示是否包含未出库的记录,prefix为前缀,如'WPR-2023-0)""" from apps.inm.models import MIOItemw + prefix = request.query_params.get("prefix", None) if not prefix: raise ParseError("请传入前缀参数") @@ -67,7 +74,7 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu SELECT id, number_out FROM wpmw_wpr WHERE number_out ~ %s order by number_out desc limit 1 """ - pattern = f'^{prefix}[0-9]+$' + pattern = f"^{prefix}[0-9]+$" number_outs = [] wpr_qs_last = query_one_dict(query, [pattern]) if wpr_qs_last: @@ -87,7 +94,7 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu if number_outs: number_outs.sort() number_out_last = number_outs[-1] - number_int_last = number_out_last.lstrip(prefix).lstrip('0') + number_int_last = number_out_last.lstrip(prefix).lstrip("0") try: number_int_last = int(number_int_last) except ValueError: @@ -95,9 +102,8 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu return Response({"number_out_last": number_out_last, "number_out_int_last": int(number_int_last)}) else: return Response({"number_out_last": None}) - - @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WproutListSerializer) + @action(methods=["post"], detail=False, perms_map={"post": "*"}, serializer_class=WproutListSerializer) @transaction.atomic def assgin_number_out(self, request, *args, **kwargs): """分配出库对外编号 @@ -108,7 +114,7 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu vdata = sr.validated_data items = vdata["items"] number_outs = [i["number_out"] for i in items] - existing_numbers = Wpr.objects.filter(number_out__in=number_outs, number_out__isnull=False).values_list('number_out', flat=True) + existing_numbers = Wpr.objects.filter(number_out__in=number_outs, number_out__isnull=False).values_list("number_out", flat=True) if existing_numbers.exists(): used_numbers = list(existing_numbers) raise ParseError(f"以下对外编号已被使用: {used_numbers[0]} 共{len(used_numbers)}个") @@ -116,4 +122,4 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu wpr = Wpr.objects.get(id=i["id"]) wpr.number_out = i["number_out"] wpr.save() - return Response() \ No newline at end of file + return Response()