From 5c21d6042bfb8cb79a0020021e2707c42b4c27fc Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 28 Jul 2025 16:56:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=94=80=E5=94=AE=E5=8F=91=E8=B4=A7?= =?UTF-8?q?=E6=97=B6=E5=8F=AF=E4=BB=A5=E8=AE=BE=E7=BD=AE=E5=AF=B9=E5=A4=96?= =?UTF-8?q?=E7=BC=96=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inm/migrations/0034_mioitemw_number_out.py | 18 ++++++++++++++++++ apps/inm/models.py | 1 + apps/inm/services.py | 6 +++++- apps/wpmw/models.py | 9 ++++++++- apps/wpmw/views.py | 14 +++++++++++--- 5 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 apps/inm/migrations/0034_mioitemw_number_out.py diff --git a/apps/inm/migrations/0034_mioitemw_number_out.py b/apps/inm/migrations/0034_mioitemw_number_out.py new file mode 100644 index 00000000..0b54636d --- /dev/null +++ b/apps/inm/migrations/0034_mioitemw_number_out.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2025-07-28 08:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inm', '0033_alter_mio_type'), + ] + + operations = [ + migrations.AddField( + model_name='mioitemw', + name='number_out', + field=models.TextField(blank=True, null=True, verbose_name='对外编号'), + ), + ] diff --git a/apps/inm/models.py b/apps/inm/models.py index 44a8737d..88d775a2 100644 --- a/apps/inm/models.py +++ b/apps/inm/models.py @@ -212,6 +212,7 @@ class MIOItemw(BaseModel): TN:单件记录 """ number = models.TextField('编号') + number_out = models.TextField('对外编号', null=True, blank=True) wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.SET_NULL, related_name='wpr_mioitemw' , null=True, blank=True) mioitem = models.ForeignKey(MIOItem, verbose_name='关联出入库明细', on_delete=models.CASCADE, related_name='w_mioitem') diff --git a/apps/inm/services.py b/apps/inm/services.py index 9a7db5e9..57c165af 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -359,6 +359,7 @@ class InmService: out = -1 默认使用count字段做加减 """ + mio_type = i.mio.type material: Material = i.material warehouse = i.warehouse tracking = material.tracking @@ -439,8 +440,11 @@ class InmService: mioitemws = MIOItemw.objects.filter(Q(ftest=None) | Q(ftest__defect_main=None), mioitem=i) if mioitemws.count() != change_count: raise ParseError("出入库与明细数量不一致,操作失败") + number_out = None + if mio_type == MIO.MIO_TYPE_SALE_OUT: + number_out = mioitemw.number_out for mioitemw in mioitemws: - Wpr.change_or_new(wpr=mioitemw.wpr, old_mb=mb) + Wpr.change_or_new(wpr=mioitemw.wpr, old_mb=mb, number_out=number_out) else: raise ParseError("不支持的操作") diff --git a/apps/wpmw/models.py b/apps/wpmw/models.py index 2bb56285..87febd98 100644 --- a/apps/wpmw/models.py +++ b/apps/wpmw/models.py @@ -8,6 +8,7 @@ from apps.wpm.models import WmStateOption, Mlogbw, Handoverbw from apps.utils.tools import update_dict from apps.inm.models import MIOItemw from django.db.models import F, Value +from django.db import IntegrityError # Create your models here. class Wpr(BaseModel): @@ -31,7 +32,7 @@ class Wpr(BaseModel): data = models.JSONField(verbose_name="数据", default=dict, blank=True) @classmethod - def change_or_new(cls, wpr=None, number=None, mb=None, wm=None, old_mb=None, old_wm=None, ftest=None, wpr_from=None, add_version=True): + def change_or_new(cls, wpr=None, number=None, mb=None, wm=None, old_mb=None, old_wm=None, ftest=None, wpr_from=None, add_version=True, number_out=None): is_create = False if wpr is None and number is None: raise ParseError("id和number不能同时为空") @@ -127,6 +128,12 @@ class Wpr(BaseModel): ins.save() # if ins.mb and ins.wm: # raise ParseError("所属仓库批次和车间批次不可同时存在2") + if number_out: + try: + ins.number_out = number_out + ins.save() + except IntegrityError: + raise ParseError(f"{ins.number}-出库编号-{number_out}-已存在") return ins @classmethod diff --git a/apps/wpmw/views.py b/apps/wpmw/views.py index 4cd0b571..f9ab729b 100644 --- a/apps/wpmw/views.py +++ b/apps/wpmw/views.py @@ -54,6 +54,14 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu 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}) - def assgin_number_out(self, request, *args, **kwargs): - """分配对外编号""" - pass \ No newline at end of file + @action(methods=['get'], detail=False, perms_map={'get': '*'}) + def number_out_last(self, request, *args, **kwargs): + """获取最新的出库对外编号""" + prefix = request.query_params.get("prefix") + wpr_qs_last = Wpr.objects.filter(number_out__startswith=prefix).order_by("number_out").last() + if wpr_qs_last: + number_out = wpr_qs_last.number_out + number_int = number_out.lstrip(prefix).lstrip('0') + return Response({"number_out_last": wpr_qs_last.number_out, "number_out_int_last": number_int}) + else: + return Response({"number_out_last": None}) \ No newline at end of file