From dda876092e3504b4bd6b4b17612c3fe53368d7b6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 28 Oct 2025 16:22:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BC=96=E5=8F=B7=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=90=8E=E5=9C=A8=E6=8F=90=E4=BA=A4=E6=97=B6=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/services.py | 7 +++++++ apps/wpm/views.py | 4 +++- apps/wpmw/serializers.py | 4 ++++ apps/wpmw/views.py | 22 +++++++++++++++++++++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 14272d61..52d75881 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -28,6 +28,11 @@ from apps.utils.lock import lock_model_record_d_func myLogger = logging.getLogger('log') +def check_wpr_number(number: str): + return (len(number) >= 5 and + number[-4:].isdigit() and + not any(char.islower() for char in number)) + def generate_new_batch(old_batch: str, mlog: Mlog): new_batch = old_batch supplier = mlog.supplier @@ -372,6 +377,8 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): if item.wpr: Wpr.change_or_new(wpr=item.wpr, wm=wm, ftest=item.ftest) else: + if not check_wpr_number(item.number): + raise ParseError(f'{item.number} 该编号格式有误') wpr_from = None if item.mlogbw_from: wpr_from = item.mlogbw_from.wpr diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 5e0b8551..456cded1 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -65,6 +65,7 @@ from django.db.models import Prefetch from drf_yasg.utils import swagger_auto_schema from drf_yasg import openapi from django.db import connection +from django.db.models.functions import Substr, Length # Create your views here. @@ -962,7 +963,8 @@ class MlogbInViewSet(BulkCreateModelMixin, BulkUpdateModelMixin, BulkDestroyMode wpr_mlogbw__mlogb__mlog__handle_date__year=c_year, wpr_mlogbw__mlogb__mlog__handle_date__month=c_month, ) - .order_by("number") + .annotate(last_four=Substr("number", Length("number")-3)) + .order_by("last_four") .last() ) cq_w = 4 diff --git a/apps/wpmw/serializers.py b/apps/wpmw/serializers.py index 8191af4d..707d74eb 100644 --- a/apps/wpmw/serializers.py +++ b/apps/wpmw/serializers.py @@ -51,3 +51,7 @@ class WproutSerializer(serializers.Serializer): class WproutListSerializer(serializers.Serializer): items = WproutSerializer(many=True) + +class WprChangeNumberSerializer(serializers.Serializer): + old_number = serializers.CharField(label="原编号") + new_number = serializers.CharField(label="新编号") \ No newline at end of file diff --git a/apps/wpmw/views.py b/apps/wpmw/views.py index 3c9a9a59..5aaa1eac 100644 --- a/apps/wpmw/views.py +++ b/apps/wpmw/views.py @@ -3,7 +3,7 @@ from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet from apps.utils.mixins import CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin from apps.wpmw.models import Wpr, WprDefect -from apps.wpmw.serializers import WprSerializer, WprNewSerializer, WprDetailSerializer, WproutListSerializer +from apps.wpmw.serializers import WprSerializer, WprNewSerializer, WprDetailSerializer, WproutListSerializer, WprChangeNumberSerializer from rest_framework.response import Response from apps.mtm.models import Material from rest_framework.exceptions import ParseError @@ -41,6 +41,26 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu else: qs.exclude(mb=None, wm=None) return qs + + @action(methods=["post"], detail=False, perms_map={"post": "*"}, serializer_class=WprChangeNumberSerializer) + @transaction.atomic + def change_number(self, request, *args, **kwargs): + """修改编号""" + sr = WprChangeNumberSerializer(data=request.data) + sr.is_valid(raise_exception=True) + vdata = sr.validated_data + new_number = vdata["new_number"] + old_number = vdata["old_number"] + if Wpr.objects.filter(number=new_number).exists(): + raise ParseError("新编号已存在,不可使用") + wpr = Wpr.objects.get(number=old_number) + from apps.wpm.models import Mlogbw, Handoverbw + from apps.inm.models import MIOItemw + Wpr.objects.filter(id=wpr.id).update(number=new_number) + Mlogbw.objects.filter(wpr=wpr).update(number=new_number) + Handoverbw.objects.filter(wpr=wpr).update(number=new_number) + MIOItemw.objects.filter(wpr=wpr).update(number=new_number) + return Response() @action(methods=["post"], detail=False, perms_map={"post": "*"}, serializer_class=WprNewSerializer) def new_number(self, request, *args, **kwargs):