diff --git a/apps/inm/migrations/0022_mioitemw.py b/apps/inm/migrations/0022_mioitemw.py new file mode 100644 index 00000000..ec884972 --- /dev/null +++ b/apps/inm/migrations/0022_mioitemw.py @@ -0,0 +1,37 @@ +# Generated by Django 3.2.12 on 2024-12-31 00:41 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('inm', '0021_auto_20241113_1716'), + ] + + operations = [ + migrations.CreateModel( + name='MIOItemw', + 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='删除标记')), + ('number', models.TextField(verbose_name='编号')), + ('test_json', models.JSONField(blank=True, default=dict, verbose_name='检验情况')), + ('defect_json', models.JSONField(blank=True, default=list, verbose_name='缺陷情况')), + ('note', models.TextField(blank=True, null=True, verbose_name='备注')), + ('test_time', models.DateTimeField(blank=True, null=True, verbose_name='检验时间')), + ('is_testok', models.BooleanField(default=True, verbose_name='检验是否合格')), + ('mioitem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='w_mioitem', to='inm.mioitem', verbose_name='关联出入库明细')), + ('test_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='检验人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/inm/models.py b/apps/inm/models.py index 505272c3..0b93475e 100644 --- a/apps/inm/models.py +++ b/apps/inm/models.py @@ -165,3 +165,18 @@ class MIOItemA(BaseModel): zhuidu = models.FloatField('锥度', null=True, blank=True) b_zuidawaijing = models.FloatField('最大外径', null=True, blank=True) g_zuidaneijing = models.FloatField('最大内径', null=True, blank=True) + + +class MIOItemw(BaseModel): + """ + 单件记录 + """ + number = models.TextField('编号') + mioitem = models.ForeignKey(MIOItem, verbose_name='关联出入库明细', on_delete=models.CASCADE, related_name='w_mioitem') + test_json = models.JSONField('检验情况', default=dict, blank=True) + defect_json = models.JSONField('缺陷情况', default=list, blank=True) + note = models.TextField('备注', null=True, blank=True) + test_user = models.ForeignKey(User, verbose_name='检验人', on_delete=models.SET_NULL, null=True, blank=True) + test_time = models.DateTimeField('检验时间', null=True, blank=True) + is_testok = models.BooleanField('检验是否合格', default=True) + \ No newline at end of file diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 318152b9..216205f1 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -7,8 +7,8 @@ from apps.sam.models import Order 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 .models import MIO, MaterialBatch, MIOItem, WareHouse, MIOItemA, MaterialBatchA +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 @@ -92,10 +92,20 @@ class MIOItemACreateSerializer(CustomModelSerializer): fields = ['material', 'batch', 'zhuidu', 'b_zuidawaijing', 'g_zuidaneijing'] +class MIOItemwCreateSerializer(CustomModelSerializer): + class Meta: + model = MIOItemw + fields = ["number", "note"] + +class MIOItemwSerializer(CustomModelSerializer): + class Meta: + model = MIOItemw + fields = "__all__" class MIOItemCreateSerializer(CustomModelSerializer): assemb = MIOItemACreateSerializer( label='组合件信息', many=True, write_only=True, required=False) + wproducts = MIOItemwCreateSerializer(many=True) class Meta: model = MIOItem @@ -104,7 +114,7 @@ class MIOItemCreateSerializer(CustomModelSerializer): def create(self, validated_data): mio = validated_data['mio'] - material = validated_data['material'] + material: Material = validated_data['material'] batch = validated_data['batch'] if mio.state != MIO.MIO_CREATE: raise ValidationError('出入库记录非创建中不可新增') @@ -116,7 +126,10 @@ class MIOItemCreateSerializer(CustomModelSerializer): if mis.exists() and (not mis.exclude(test_date=None).exists()): raise ValidationError('该批次的物料未经检验') with transaction.atomic(): + count = validated_data["count"] + batch = validated_data["batch"] assemb = validated_data.pop('assemb', []) + wproducts = validated_data.pop('wproducts', []) instance = super().create(validated_data) assemb_dict = {} for i in assemb: @@ -130,6 +143,16 @@ class MIOItemCreateSerializer(CustomModelSerializer): mioitem=instance, rate=v, **mia) else: raise ParseError('缺少组合件') + if material.tracking == Material.MA_TRACKING_SINGLE: + if count == 1 and len(wproducts) == 0: + MIOItemw.objects.create(mioitem=instance, number=batch) + elif count == 1 and len(wproducts) >= 1: + MIOItemw.objects.create(mioitem=instance, number=wproducts[0]['number'], note=wproducts[0]['note']) + elif count > 1 and len(wproducts) == count: + for w in wproducts: + MIOItemw.objects.create(mioitem=instance, number=w['number'], note=w['note']) + else: + raise ParseError('单个明细信息不匹配') return instance @@ -154,10 +177,12 @@ class MIOItemSerializer(CustomModelSerializer): source='material', read_only=True) inout_date = serializers.DateField(source='mio.inout_date', read_only=True) test_user_name = serializers.CharField(source='test_user.name', read_only=True) + wproducts = MIOItemwSerializer(source='w_mioitem', read_only=True, many=True) class Meta: model = MIOItem fields = '__all__' + class MIODoSerializer(CustomModelSerializer):