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):