From 1fccdd042cc0e92afa26a5d2cc816a385d1125d2 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 31 Jul 2025 14:05:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=8F=91=E8=B4=A7?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inm/migrations/0035_auto_20250731_1404.py | 34 +++++++++++++++++++ apps/inm/models.py | 10 +++++- apps/inm/serializers.py | 12 ++++++- apps/inm/services.py | 5 +-- 4 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 apps/inm/migrations/0035_auto_20250731_1404.py diff --git a/apps/inm/migrations/0035_auto_20250731_1404.py b/apps/inm/migrations/0035_auto_20250731_1404.py new file mode 100644 index 00000000..b4019036 --- /dev/null +++ b/apps/inm/migrations/0035_auto_20250731_1404.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.12 on 2025-07-31 06:04 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('inm', '0034_mioitemw_number_out'), + ] + + operations = [ + migrations.CreateModel( + name='Pack', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('index', models.PositiveSmallIntegerField(default=1, verbose_name='序号')), + ('mio', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pack_mio', to='inm.mio', verbose_name='关联出入库记录')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='mioitem', + name='pack', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mioitem_pack', to='inm.pack', verbose_name='关联装箱单'), + ), + ] diff --git a/apps/inm/models.py b/apps/inm/models.py index 88d775a2..b06dc50b 100644 --- a/apps/inm/models.py +++ b/apps/inm/models.py @@ -133,6 +133,13 @@ class MIO(CommonBDModel): last_number = 1 return f"{prefix}-{today_str}-{last_number:04d}" +class Pack(BaseModel): + """ + TN:装箱单 + """ + index = models.PositiveSmallIntegerField('序号', default=1) + mio = models.ForeignKey(MIO, verbose_name='关联出入库记录', on_delete=models.CASCADE, related_name='pack_mio') + class MIOItem(BaseModel): """ TN:出入库明细 @@ -178,6 +185,7 @@ class MIOItem(BaseModel): is_testok = models.BooleanField('检验是否合格', null=True, blank=True) note = models.TextField('备注', null=True, blank=True) + pack = models.ForeignKey(Pack, verbose_name='关联装箱单', on_delete=models.SET_NULL, related_name='mioitem_pack', null=True, blank=True) @classmethod def count_fields(cls): @@ -219,4 +227,4 @@ class MIOItemw(BaseModel): ftest = models.ForeignKey("qm.ftest", verbose_name='关联检验记录', on_delete=models.PROTECT, related_name='mioitemw_ftest', null=True, blank=True) note = models.TextField('备注', null=True, blank=True) - \ No newline at end of file + diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 970299ab..8b5d61e4 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -8,7 +8,7 @@ from apps.system.models import Dept, User from apps.utils.constants import EXCLUDE_FIELDS_BASE, EXCLUDE_FIELDS_DEPT, EXCLUDE_FIELDS from apps.utils.serializers import CustomModelSerializer from apps.mtm.models import Material -from .models import MIO, MaterialBatch, MIOItem, WareHouse, MIOItemA, MaterialBatchA, MIOItemw +from .models import MIO, MaterialBatch, MIOItem, WareHouse, MIOItemA, MaterialBatchA, MIOItemw, Pack from django.db import transaction from server.settings import get_sysconfig from apps.wpmw.models import Wpr @@ -118,6 +118,7 @@ class MIOItemCreateSerializer(CustomModelSerializer): def create(self, validated_data): mio:MIO = validated_data['mio'] + mio_type = mio.type mb = validated_data.get('mb', None) wm = validated_data.get('wm', None) assemb = validated_data.pop('assemb', []) @@ -194,6 +195,8 @@ class MIOItemCreateSerializer(CustomModelSerializer): for item in mioitemw: if item.get("wpr", None) is None and mio_type != "pur_in" and mio_type != "other_in": raise ParseError(f'{item["number"]}_请提供产品明细ID') + elif item.get("number_out", None) is not None and mio_type != MIO.MIO_TYPE_SALE_OUT: + raise ParseError(f'{item["number"]}_非销售出库不可赋予产品对外编号') else: MIOItemw.objects.create(mioitem=instance, **item) return instance @@ -407,3 +410,10 @@ class MIOItemPurInTestSerializer(CustomModelSerializer): attrs['weight_kgs'] = [float(i) for i in weight_kgs] attrs['count_sampling'] = len(attrs['weight_kgs']) return super().validate(attrs) + + +class PackSerializer(CustomModelSerializer): + class Meta: + model = Pack + fields = "__all__" + read_only_fields = EXCLUDE_FIELDS_BASE \ No newline at end of file diff --git a/apps/inm/services.py b/apps/inm/services.py index c0b112d5..145f9568 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -441,10 +441,7 @@ class InmService: if mioitemws.count() != change_count: raise ParseError("出入库与明细数量不一致,操作失败") for mioitemw in mioitemws: - number_out = None - if mio_type == MIO.MIO_TYPE_SALE_OUT: - number_out = mioitemw.number_out - Wpr.change_or_new(wpr=mioitemw.wpr, old_mb=mb, number_out=number_out) + Wpr.change_or_new(wpr=mioitemw.wpr, old_mb=mb, number_out=mioitemw.number_out) else: raise ParseError("不支持的操作")