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