diff --git a/apps/inm/migrations/0025_auto_20250103_1731.py b/apps/inm/migrations/0025_auto_20250103_1731.py new file mode 100644 index 00000000..517f45dd --- /dev/null +++ b/apps/inm/migrations/0025_auto_20250103_1731.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.12 on 2025-01-03 09:31 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0079_auto_20250103_1652'), + ('inm', '0024_mioitemw_wpr'), + ] + + operations = [ + migrations.AddField( + model_name='mioitem', + name='mb', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mb_mioitem', to='inm.materialbatch', verbose_name='关联仓库库存'), + ), + migrations.AddField( + model_name='mioitem', + name='wm', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='wm_mioitem', to='wpm.wmaterial', verbose_name='关联车间库存'), + ), + ] diff --git a/apps/inm/models.py b/apps/inm/models.py index 4d077670..21cc1543 100644 --- a/apps/inm/models.py +++ b/apps/inm/models.py @@ -111,6 +111,10 @@ class MIOItem(BaseModel): """ mio = models.ForeignKey(MIO, verbose_name='关联出入库', on_delete=models.CASCADE, related_name='item_mio') + mb = models.ForeignKey(MaterialBatch, verbose_name='关联仓库库存', + on_delete=models.SET_NULL, related_name='mb_mioitem', null=True, blank=True) + wm = models.ForeignKey("wpm.wmaterial", verbose_name='关联车间库存', + on_delete=models.SET_NULL, related_name='wm_mioitem', null=True, blank=True) warehouse = models.ForeignKey( WareHouse, on_delete=models.CASCADE, verbose_name='仓库') material = models.ForeignKey( diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 9777248f..7f439499 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -11,6 +11,7 @@ from apps.mtm.models import Material from .models import MIO, MaterialBatch, MIOItem, WareHouse, MIOItemA, MaterialBatchA, MIOItemw from django.db import transaction from server.settings import get_sysconfig +from apps.wpmw.models import Wpr class WareHourseSerializer(CustomModelSerializer): @@ -119,12 +120,27 @@ class MIOItemCreateSerializer(CustomModelSerializer): class Meta: model = MIOItem fields = ['mio', 'warehouse', 'material', - 'batch', 'count', 'assemb', 'is_testok', 'mioitemw'] + 'batch', 'count', 'assemb', 'is_testok', 'mioitemw', 'mb', 'wm'] + extra_kwargs = { + 'mio': {'required': True}, 'warehouse': {'required': False}, + 'material': {'required': False}, 'batch': {'required': False}} + def create(self, validated_data): mio = validated_data['mio'] + mb = validated_data.get('mb', None) + wm = validated_data.get('wm', None) + if mb: + validated_data["material"] = mb.material + validated_data["batch"] = mb.batch + validated_data["warehouse"] = mb.warehouse + elif wm: + validated_data["material"] = wm.material + validated_data["batch"] = wm.batch + material: Material = validated_data['material'] batch = validated_data['batch'] + if mio.state != MIO.MIO_CREATE: raise ValidationError('出入库记录非创建中不可新增') # 生产领料要校验是否进行检验 @@ -153,18 +169,23 @@ class MIOItemCreateSerializer(CustomModelSerializer): else: raise ParseError('缺少组合件') if material.tracking == Material.MA_TRACKING_SINGLE: - if mio.type == MIO.MIO_TYPE_PUR_IN: - if count == 1 and len(mioitemw) == 0: - MIOItemw.objects.create(mioitem=instance, number=batch) - elif count == 1 and len(mioitemw) >= 1: - MIOItemw.objects.create(mioitem=instance, number=mioitemw[0]['number'], note=mioitemw[0]['note']) - elif count > 1 and len(mioitemw) == count: - for item in mioitemw: - MIOItemw.objects.create(mioitem=instance, number=item['number'], note=item['note']) + if len(mioitemw) == 0: + if mb: + wpr_qs = Wpr.get_qs_by_mb(mb) + if wpr_qs.count() == validated_data["count"]: + for item in wpr_qs: + MIOItemw.objects.create(mioitem=instance, number=item.number, wpr=item) + else: + raise ParseError('请提供产品明细编号') + elif wm: + wpr_qs = Wpr.get_qs_by_wm(wm) + if wpr_qs.count() == validated_data["count"]: + for item in wpr_qs: + MIOItemw.objects.create(mioitem=instance, number=item.number, wpr=item) + else: + raise ParseError('请提供产品明细编号') else: - raise ParseError('单个明细信息不匹配') - else: - raise ParseError("暂只支持采购入库") + raise ParseError('不支持自动生成请提供产品明细') return instance diff --git a/apps/wpmw/models.py b/apps/wpmw/models.py index 67cfccc5..145d8ad5 100644 --- a/apps/wpmw/models.py +++ b/apps/wpmw/models.py @@ -47,6 +47,14 @@ class Wpr(BaseModel): def clear(cls, number_list): cls.objects.filter(number__in=number_list).update(mb=None, wm=None) + @classmethod + def get_qs_by_mb(cls, mb): + return cls.objects.filter(mb=mb, wm=None) + + @classmethod + def get_qs_by_wm(cls, wm): + return cls.objects.filter(wm=wm, mb=None) + class WprDefect(BaseModel): wpr = models.ForeignKey(Wpr, verbose_name="关联产物", on_delete=models.CASCADE)