feat: 编号生成后在提交时进行校验

This commit is contained in:
caoqianming 2025-10-28 16:22:02 +08:00
parent 4e817d9954
commit dda876092e
4 changed files with 35 additions and 2 deletions

View File

@ -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

View File

@ -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

View File

@ -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="新编号")

View File

@ -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
@ -42,6 +42,26 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu
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):
"""获取新的编号"""