diff --git a/apps/wpm/migrations/0069_auto_20240905_1057.py b/apps/wpm/migrations/0069_auto_20240905_1057.py new file mode 100644 index 00000000..efbae9e8 --- /dev/null +++ b/apps/wpm/migrations/0069_auto_20240905_1057.py @@ -0,0 +1,40 @@ +# Generated by Django 3.2.12 on 2024-09-05 02:57 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0068_auto_20240904_1549'), + ] + + operations = [ + migrations.AlterField( + model_name='handover', + name='batch', + field=models.CharField(blank=True, max_length=50, null=True, verbose_name='批次号'), + ), + migrations.AlterField( + model_name='handover', + name='type', + field=models.PositiveSmallIntegerField(choices=[(10, '正常交接'), (20, '返修交接'), (30, '检验交接'), (40, '报废交接')], default=10, verbose_name='交接类型'), + ), + migrations.CreateModel( + name='Handoverb', + 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='删除标记')), + ('count', models.PositiveIntegerField(default=0, verbose_name='送料数')), + ('handover', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wpm.handover', verbose_name='关联交接记录')), + ('wm', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='handoverb_wm', to='wpm.wmaterial', verbose_name='关联车间库存')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 3664c3c9..4500fb6a 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -297,7 +297,7 @@ class Handover(CommonADModel): Mgroup, verbose_name='送料工段', on_delete=models.CASCADE, null=True, blank=True) send_dept = models.ForeignKey( Dept, verbose_name='送料部门', on_delete=models.CASCADE, related_name='handover_send_dept') - batch = models.CharField('批次号', max_length=50) + batch = models.CharField('批次号', max_length=50, null=True, blank=True) material = models.ForeignKey( Material, verbose_name='物料', on_delete=models.CASCADE, related_name='h_ma') material_changed = models.ForeignKey(Material, verbose_name='变更后物料', on_delete=models.CASCADE, null=True, blank=True, related_name='h_ma_c') @@ -319,8 +319,15 @@ class Handover(CommonADModel): submit_user = models.ForeignKey( User, verbose_name='提交人', on_delete=models.CASCADE, null=True, blank=True, related_name='handover_submit_user') + @property + def handoverb(self): + return Handoverb.objects.filter(handover=self) + class Handoverb(BaseModel): - pass + handover = models.ForeignKey(Handover, verbose_name='关联交接记录', on_delete=models.CASCADE) + wm = models.ForeignKey(WMaterial, verbose_name='关联车间库存', on_delete=models.SET_NULL, + null=True, blank=True, related_name='handoverb_wm') + count = models.PositiveIntegerField('送料数', default=0) class AttLog(CommonADModel): """ diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 0b0f1504..1e464be5 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -4,7 +4,8 @@ from rest_framework import serializers from rest_framework.exceptions import ValidationError, ParseError from datetime import datetime -from .models import SfLog, StLog, SfLogExp, WMaterial, Mlog, Handover, Mlogb, AttLog, OtherLog, Fmlog +from .models import (SfLog, StLog, SfLogExp, WMaterial, Mlog, + Handover, Handoverb, Mlogb, AttLog, OtherLog, Fmlog) from apps.system.models import Dept, User from apps.system.serializers import UserSimpleSerializer from apps.pm.models import Mtask, Mtaskb @@ -542,6 +543,12 @@ class MlogRelatedSerializer(serializers.Serializer): class DeptBatchSerializer(serializers.Serializer): belong_dept_name = serializers.CharField(label='车间名称') +class HandoverbSerializer(CustomModelSerializer): + class Meta: + model = Handoverb + fields = "__all__" + read_only_fields = EXCLUDE_FIELDS_BASE + ['handover'] + extra_kwargs = {'wm': {'required': True}} class HandoverSerializer(CustomModelSerializer): # wm = serializers.PrimaryKeyRelatedField( @@ -560,12 +567,20 @@ class HandoverSerializer(CustomModelSerializer): material_name = serializers.StringRelatedField( source='material', read_only=True) wm_notok_sign = serializers.CharField(source='wm.notok_sign', read_only=True) + handoverb = HandoverbSerializer(many=True, read_only=True) def validate(self, attrs): if 'type' not in attrs: attrs['type'] = Handover.H_NORMAL - wm:WMaterial = attrs['wm'] - material = wm.material + wm:WMaterial = attrs.get('wm', None) + handoverb = attrs.get('handoverb', []) + if wm: + material = wm.material + attrs['handoverb'] = [{"wm": wm, "count": attrs["count"] }] + elif handoverb: + wm: WMaterial = handoverb[0]["wm"] + else: + raise ParseError('必须指定车间库存') attrs['material'] = wm.material attrs['batch'] = wm.batch attrs['send_dept'] = wm.belong_dept @@ -579,10 +594,14 @@ class HandoverSerializer(CustomModelSerializer): raise ValidationError('收料车间和收料工段必须有一个') if 'send_dept' not in attrs and 'send_mgroup' not in attrs: raise ValidationError('送料车间和送料工段必须有一个') - if wm.notok_sign is not None and attrs['type'] in [Handover.H_NORMAL, Handover.H_TEST]: - raise ValidationError('物料不合格,不能进行正常/检验交接') - if wm.count_xtest is not None: - raise ValidationError('物料检验中,不能进行交接') + for ind, item in enumerate(handoverb): + wm = item["wm"] + if attrs["material"] != wm.material: + raise ParseError(f'第{ind+1}物料与交接物料不一致') + if wm.notok_sign is not None and attrs['type'] in [Handover.H_NORMAL, Handover.H_TEST]: + raise ParseError(f'第{ind+1}物料不合格,不能进行正常/检验交接') + if wm.count_xtest is not None: + raise ParseError(f'第{ind+1}物料检验中,不能进行交接') return attrs class Meta: @@ -591,7 +610,7 @@ class HandoverSerializer(CustomModelSerializer): read_only_fields = EXCLUDE_FIELDS + ["mlog"] extra_kwargs = { "type": {"required": False}, - "wm": {"required": True}, + "wm": {"required": False}, "send_dept": {"required": False}, "recive_mgroup": {"required": False}, "recive_dept": {"required": False}, @@ -614,6 +633,7 @@ class HandoverUpdateSerializer(CustomModelSerializer): fields = ['id', 'send_date', 'send_user', 'count', 'count_eweight', 'recive_user'] + class GenHandoverSerializer(serializers.Serializer): mlogs = serializers.PrimaryKeyRelatedField( label='mlog的ID列表', queryset=Mlog.objects.all(), many=True)