diff --git a/apps/qm/migrations/0021_ftestwork_mb.py b/apps/qm/migrations/0021_ftestwork_mb.py new file mode 100644 index 00000000..72b4cba5 --- /dev/null +++ b/apps/qm/migrations/0021_ftestwork_mb.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2024-08-19 03:25 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('inm', '0001_initial'), + ('qm', '0020_auto_20240814_1756'), + ] + + operations = [ + migrations.AddField( + model_name='ftestwork', + name='mb', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='inm.materialbatch', verbose_name='关联仓库'), + ), + ] diff --git a/apps/qm/models.py b/apps/qm/models.py index 55437375..e069a46d 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -108,6 +108,7 @@ class FtestWork(CommonBDModel): type = models.CharField('检验类型', max_length=20, choices=FTEST_TYPE_CHOICES, default='prod') type2 = models.PositiveSmallIntegerField('检验类型2', choices=((10, '抽检'), (20, '全检')), default=10) wm = models.ForeignKey(WMaterial, verbose_name='关联车间库存', on_delete=models.SET_NULL, null=True, blank=True) + mb = models.ForeignKey('inm.materialbatch', verbose_name='关联仓库', on_delete=models.SET_NULL, null=True, blank=True) test_date = models.DateField('检验日期') material = models.ForeignKey( Material, verbose_name='产品', on_delete=models.CASCADE) diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index 28d12c88..47e1561b 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -6,6 +6,7 @@ from rest_framework.exceptions import ValidationError from apps.system.models import Dept, Dictionary from apps.wpm.models import SfLog, WMaterial from django.db import transaction +from apps.inm.serializers import MaterialBatchDetailSerializer class TestItemSerializer(CustomModelSerializer): @@ -62,33 +63,39 @@ class QuaStatUpdateSerializer(CustomModelSerializer): class FtestWorkCreateUpdateSerializer(CustomModelSerializer): class Meta: model = FtestWork - fields = ['id', 'wm', 'type', 'type2', 'test_date', 'count', 'count_sampling', 'count_ok', 'count_notok', 'count_notok_json', 'test_user'] + fields = ['id', 'wm', 'mb', 'type', 'type2', 'test_date', 'count', 'count_sampling', 'count_ok', 'count_notok', 'count_notok_json', 'test_user'] extra_kwargs = {'test_user': {'required': True}, 'type': {'required': True}} def validate(self, attrs): type2 = attrs.get('type2', 20) if type2 == 20: # 如果是全检 attrs['count_sampling'] = attrs['count'] - if 'wm' not in attrs: - raise ValidationError('请选择车间库存') - wm:WMaterial = attrs['wm'] - if wm.state not in [WMaterial.WM_OK, WMaterial.WM_TEST]: - raise ValidationError('不支持对该物料检验') - attrs['material'] = wm.material - attrs['batch'] = wm.batch - count_notok_json = attrs.get('count_notok_json', None) - if count_notok_json is None: - raise ValidationError('不合格项不能为空') - count_notok = 0 - for k, v in count_notok_json.items(): - k_2 = k.replace('count_n_', '') - if k_2 not in NotOkOption.values: - raise ValidationError(f'不支持的不合格项{k_2}') - if isinstance(v, int) and v >= 0: - count_notok = count_notok + v - else: - raise ValidationError(f'不合格项{k_2}必须为非负整数') - attrs['count_notok'] = count_notok + if 'wm' in attrs and attrs['wm']: + attrs['mb'] = None + wm:WMaterial = attrs['wm'] + if wm.state not in [WMaterial.WM_OK, WMaterial.WM_TEST]: + raise ValidationError('不支持对该物料检验') + attrs['material'] = wm.material + attrs['batch'] = wm.batch + count_notok_json = attrs.get('count_notok_json', None) + if count_notok_json is None: + raise ValidationError('不合格项不能为空') + count_notok = 0 + for k, v in count_notok_json.items(): + k_2 = k.replace('count_n_', '') + if k_2 not in NotOkOption.values: + raise ValidationError(f'不支持的不合格项{k_2}') + if isinstance(v, int) and v >= 0: + count_notok = count_notok + v + else: + raise ValidationError(f'不合格项{k_2}必须为非负整数') + attrs['count_notok'] = count_notok + elif 'mb' in attrs and attrs['mb']: + attrs['wm'] = None + attrs['material'] = attrs['mb'].material + attrs['batch'] = attrs['mb'].batch + else: + raise ValidationError('请选择车间/仓库库存') return attrs @@ -96,6 +103,7 @@ class FtestWorkSerializer(CustomModelSerializer): material_name = serializers.StringRelatedField( source='material', read_only=True) material_cate = serializers.CharField(source='material.cate', read_only=True) + mb_ = MaterialBatchDetailSerializer(source='mb', read_only=True) class Meta: model = FtestWork diff --git a/apps/qm/views.py b/apps/qm/views.py index 9e11f534..f03aa727 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -125,7 +125,7 @@ class FtestWorkViewSet(CustomModelViewSet): serializer_class = FtestWorkSerializer create_serializer_class = FtestWorkCreateUpdateSerializer update_serializer_class = FtestWorkCreateUpdateSerializer - select_related_fields = ['material'] + select_related_fields = ['material', 'mb', 'mb__material'] filterset_class = FtestWorkFilter def update(self, request, *args, **kwargs): @@ -148,6 +148,8 @@ class FtestWorkViewSet(CustomModelViewSet): 提交检验工作 """ ins:FtestWork = self.get_object() + if ins.wm is None: + raise ParseError('该检验工作未关联车间库存') if ins.submit_time is None: ftestwork_submit(ins, request.user) else: